pxc3110
pxc3110

Reputation: 243

check input program gets stuck in an infinte loop

I'm trying to create a program that asks to type something and check if it is an integer. If it is an integer, then print "the integer is ...". Else, print "try again" and waits for another input. However, the program prints an infinite number of "try again" if you type in a character. Here's the source code:

#include <stdio.h>
#include <stdbool.h>

int main()
{
  int inp;
  bool t = 1;
  printf("type an integer\n");
  while (t) {
    if (scanf("%i", &inp) == 1) { 
      printf("The integer is %i", inp);
      t = 0;
    } else {
      printf("try again");
      scanf("%i", &inp);
    }
  }
}

Upvotes: 0

Views: 187

Answers (4)

chux
chux

Reputation: 154572

OP's code fail to consume the offending non-numeric input. It remains in stdin, for the next input function. As it is unfortunately just another scanf("%i", &inp) which fails the same way - infinite loop.

After attempting to read an int, read the rest of the line.

#include <stdio.h>
#include <stdbool.h>

int main() {
  int inp;
  int scan_count;
  printf("Type an integer\n");
  do {
    scan_count = scanf("%i", &inp); // 1, 0, or EOF

     // consume rest of line
    int ch;
    while ((ch == fgetchar()) != '\n' && ch != EOF) {
      ;
    }

  } while (scan_count == 0); 
  if (scan_count == 1) {  
    printf("The integer is %i\n", inp);
  } else {
    puts("End of file or error");
  }
}

An even better approach would read the line of user input with fgets(). Example

Upvotes: 2

CWLiu
CWLiu

Reputation: 4043

When you entered a char, the variable inp in scanf("%d", &inp) would get null, since the input that doesn't match the format string. And the character you input would remain in the buffer, so that's the reason both your scanf would not stop.

A simplest way to fix this is modify your second scanf("%i", &inp); to scanf("%c", &c); (don't forget to declare a char c in your main function).

Upvotes: 1

mike bayko
mike bayko

Reputation: 385

There is nothing in to break the while loop.

consider getting rid of the boolean, and simply using a while (1) loop with a break. Also you should be using "%d" to indicate an integer in scanf/printf. And there is no need for the scanf call in the else, since your program would loop back and call scanf again anyway.

#include <stdio.h>
int main() {
  int inp = 0;
  printf("type an integer\n");
  while (1) {
    if (scanf("%d", &inp) == 1) { 
      printf("The integer is %d", inp);
      break;
    }
    else {
      printf("try again");
    }
  }
  return 0;
}

I hope this helped.

Upvotes: 0

Dada Bellmon
Dada Bellmon

Reputation: 23

check here while(t) its in an infinite loop because you have to set a condition for t something like while(t==1) or while(t>1) or (t<1) something like that. saying while(t) means that t can be anything and it will continue to run.

Upvotes: 0

Related Questions