How to handle exception when scanf of integer gets a character

后端 未结 4 394
南笙
南笙 2021-01-21 09:08

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

相关标签:
4条回答
  • 2021-01-21 09:14

    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
    
    0 讨论(0)
  • 2021-01-21 09:22

    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.

    0 讨论(0)
  • 2021-01-21 09:31

    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;
    }
    
    0 讨论(0)
  • 2021-01-21 09:34

    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.

    0 讨论(0)
提交回复
热议问题