简体   繁体   中英

C loops infinitely at scanf()

I'm new to C and I've checked for some solutions, though I can only find stuff for chars (and tried their solutions with chars), it didn't work aswell, I want to know why I'm infinitely looping (Can't input anything aswell). What I expect is a new input when I enter for example a letter.

#include <stdio.h>
#pragma warning(disable:4996)

int main(void)
{
  float num1;
  while (!(scanf("%f", &num1)))
   {
     scanf("%f", &num1);
   }
}
  • When you enter the first input as a number, the loop exits as expected
  • When you enter a character, scanf will returns 0 since it has not read a correct input(since scanf returns the number of input items assigned). Thus it enters the for loop, but when you enter the number correctly you expect the scanf to return 1 and exit the loop.
    But the previous input is still remains in the buffer.
    One possible solution is


#include <stdio.h>
float get_float_input() {
  // Not portable
  float num1;
  while (!(scanf("%f", &num1))) {
    fseek(stdin, 0,
          SEEK_END); // to move the file pointer to the end of the buffer
  }
  return num1;
}
float get_float_input_func() {
  // Portable way
  float num1;
  int ch;
  char buff[1024];
  while (1) {
    if (fgets(buff, sizeof(buff), stdin) == NULL) {
      while ((ch = getchar()) != '\n' && ch != EOF)
        ; // Clearing the input buffer
      continue;
    }
    if (sscanf(buff, "%f", &num1) != 1) {
      continue;
    }
    break;
  }
  return num1;
}
int main(void) {
  float num1;
  num1 = get_float_input_func();
  printf("%f\n", num1);
  return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM