0

我有一个关于使用无效返回的 scanf 的问题。这是我正在测试的代码片段:

printf("Please enter a number\n");
while (scanf("%d",&number)==0)
{
    printf("Try again.\n");
    scanf("%d",&number);
}

我的推理表明,如果使用了无效类型,我的第二个 scanf 应该再次询问并测试新输入的值。但是,情况并非如此,再试一次消息永远不会停止打印,因此我必须手动终止它。我不确定为什么会这样。如果可能的话,我不想在 while 循环之前使用 scanf,尽管我知道这是一种可能的解决方法。对于此事,我将不胜感激。谢谢。

4

2 回答 2

4

scanf不返回错误代码。它返回成功执行的转换次数。

至于无限循环,它不会消耗无法转换的输入。所以它反复尝试将相同的字符串匹配为数字。尝试使用fgets丢弃有问题的输入。

于 2013-03-17T00:00:07.740 回答
1

scanf()可能会返回一个EOF以指示输入失败。

“如果在第一次转换(如果有)完成之前发生输入失败,则 scanf 函数返回宏 EOF 的值。否则,scanf 函数返回分配的输入项的数量,该数量可能少于提供的数量,甚至零,在早期匹配失败的情况下。” C11 7.21.6.4

使用scanf("%d", ...after a failedscanf("%d", ...只会导致无限循环,因为每个scanf()都试图消耗一个非数字、无空格和失败。为了解决这个问题,必须消耗有问题的数据。

printf("Please enter a number\n");
int number;
int Count;
while ((Count = scanf("%d",&number)) != 1) {
  if (Count < 0) {
    exit(1); // No more input possible
  }
  // Some char is preventing scanf() from reading an int
  scanf("%*c");  // Get it and throw away
  printf("Try again.\n");
}
printf("number = %d\n", number);
于 2013-09-06T22:37:34.597 回答