【问题标题】:How do I fix scanf? (FailSafes) [duplicate]如何修复scanf? (FailSafes)[重复]
【发布时间】:2014-12-10 14:52:15
【问题描述】:

这里我有一段简化的代码,它询问并在循环中显示一个数字,它适用于我输入的所有数字,但如果我输入一个字母或特殊字符 (!"£$%^&* -_=+ 等)它会进入精神状态并跳过输入。

 #include<stdio.h>

 int number; 
 int main()
 {
     do
     {
     system("cls");
     printf("Enter a number");
     scanf("%d",&number);
     }
     while(1==1);
}

我的问题是,我能做些什么来阻止这种情况的发生?是否有一些代码可以过滤掉这种废话或者 scanf 几乎毫无价值?

//编辑:不知何故被标记为重复,呵呵。

【问题讨论】:

  • scanf 返回一个值,为什么不检查一下,就像你应该对所有 C 库函数做的那样?
  • @JensGustedt 这需要一个额外的库,1==1 简单明了。
  • @WhipItOut Just 1 更简单
  • 如果你对 C 的理解不够透彻,无法知道 while(1) 在做什么,那么你绝对应该使用 true

标签: c function loops selection scanf


【解决方案1】:

来自here

如果输入不符合预期格式scanf() 可以 不可能明智地恢复 [..] 这里“更好”的选择是 使用fgets()fgetc() 之类的输入函数来读取输入块, 然后用sscanf() 扫描它或用字符串处理函数解析它 比如strchr()strtol()

【讨论】:

  • 我认为 fgets() 是为字符串输入保留的?
  • @WhipItOut 在成为(例如)数字之前,任何键盘输入都是字符串。
【解决方案2】:

scanf%d 将无法扫描整数并在输入字符时返回 0。因此,只需检查它是否不返回 1。如果不返回,则输入一个字符(如果返回 0),否则输入一个整数。请注意,如果遇到 EOFscanf 将返回 -1。

if(scanf("%d", &number) != 1)//character entered
{
    printf("Invalid input\n");
    scanf("%*s");//clear the invalid character(s) from stdin
}
else
{
    //a number was entered
}

scanf变成“心理”,输入字符时程序多次打印Enter a number的原因是当scanf无法从标准输入流(stdin)中扫描整数时,它返回 0 并继续执行。当下次调用scanf 时,它会看到您上次输入的字符并再次失败,并且此过程继续进行。为了防止它,只需像我在上面的代码中所做的那样清除stdin

清除stdin 的另一种流行方法是使用:

int c;
while((c = getchar()) != '\n' && c != EOF);

【讨论】:

  • 抱歉回复晚了,我在你的帖子上写了谢谢,因为评论有问题。无论如何,它有效,谢谢你
  • 检查 EOF。 scanf(...) 大于 0 表示成功。如果返回 0,则字符串格式不正确。如果小于零,则它已到文件末尾或遇到读取错误。
  • @SamuelDanielson 谢谢。相应地进行了编辑。
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2021-02-20
  • 2017-10-12
  • 2017-08-14
相关资源
最近更新 更多