How to handle exception when scanf of integer gets

2019-02-25 06:04发布

问题:

The following simple program would give an endless loop when the input is a character, though it meant to tell a character from a digit. How to test if scanf gets a character when it is supposed to be a digit using the return value of scanf?

#include <stdio.h>

int main() {
  int n;
  int return_value = 0;

  while (!return_value) {
    printf("Input a digit:");
    return_value = scanf("%d", &n);
  }

  printf("Your input is %d\n", n);

  return 0;
}

回答1:

As Joachim pointed in his answer that the character doesn't consumed by scanf here and lives in the buffer, on next iteration scanf again read the same character and again leave it to the buffer and so on. This results in infinite loop.

You need to consume this character before next iteration. Just place a getchar() after the line return_value = scanf("%d", &n);

return_value = scanf("%d", &n);
while(getchar() != '\n');     // will consume the charater


回答2:

You get an infinite loop because scanf doesn't consume the character, so the character will never leave the input buffer.

You can solve it by reading a line with e.g. fgets and then use sscanf on the line.



回答3:

Add second (nested loop ) loop that clears the input buffer before you try to read from it with another scanf.

I haven't done in a long time but it goes like that: #include

int main() {
  int n;
  int return_value = 0;

  while (!return_value) {
    printf("Input a digit:");
    return_value = scanf("%d", &n);
    // this loop will "eat" every character that's left in input buffer
    while(getchar() !='\n') {
    continue;
    }
  }

  printf("Your input is %d\n", n);

  return 0;
}

Basically, any function/method that clears the input buffer after fail will work the same way. Choose one you like the most.



回答4:

You should really use TheDubleM's suggestion and check if buffer is numeric and if so use atoi on it. In what I put below you will not detect 8f8 as bad input but just read the 8.

#include <stdio.h>

int main() {
  int n;
  int return_value = 0;
  char buffer[1024];

  while (!return_value) {
    printf("Input a digit:");
    scanf("%1024s", buffer);
    return_value = sscanf(buffer, "%d", &n);
  }

  printf("Your input is %d\n", n);

  return 0;
}


标签: c scanf