当整数的scanf获得一个字符时如何处理异常

时间:2014-05-23 09:36:13

标签: c scanf

当输入是一个字符时,下面的简单程序会给出无限循环,尽管它意味着从数字中告诉一个字符。如何scanf使用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}}

4 个答案:

答案 0 :(得分:5)

正如Joachim在他的回答中所指出的那样,scanf这里没有消耗该角色并且生活在缓冲区中,在下一次迭代中scanf再次读取相同的角色并再次离开到缓冲区等等。这导致无限循环。

您需要在下一次迭代之前使用此字符。只需在getchar()

行之后放置return_value = scanf("%d", &n);即可
return_value = scanf("%d", &n);
while(getchar() != '\n');     // will consume the charater

答案 1 :(得分:1)

你得到一个无限循环因为scanf没有消耗这个字符,所以字符永远不会离开输入缓冲区。

你可以通过阅读一行来解决这个问题。 fgets然后在该行上使用sscanf

答案 2 :(得分:1)

添加第二个(嵌套循环)循环,在您尝试使用另一个scanf读取它之前清除输入缓冲区。

我很长时间没有完成,但它是这样的:     #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;
}

基本上,任何在失败后清除输入缓冲区的函数/方法都将以相同的方式工作。选择一个你最喜欢的。

答案 3 :(得分:-1)

你应该真正使用TheDubleM的建议并检查buffer是否为数字,如果是,请使用atoi。在我下面的内容中,您不会将8f8视为错误输入,而只是阅读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;
}