George
George

Reputation: 3619

How to handle exception when scanf of integer gets a character

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;
}

Upvotes: 3

Views: 8663

Answers (4)

zubergu
zubergu

Reputation: 3706

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.

Upvotes: 1

haccks
haccks

Reputation: 106012

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

Upvotes: 7

Joel Dentici
Joel Dentici

Reputation: 206

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;
}

Upvotes: -1

Some programmer dude
Some programmer dude

Reputation: 409166

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.

Upvotes: 1

Related Questions