在EOF上终止scanf并忽略字符串

在EOF上终止scanf并忽略字符串,c,C,我使用下面的代码扫描用户输入的整数,直到行尾出现 while (scanf(" %d", &num) != EOF) { printf("Do something") } 在用户输入一个字符串而不是一个整数之前,这是可以正常工作的。然后,该程序将无休止地打印并执行某些操作。为什么会这样 如何仅在发生行尾时停止循环,而忽略字符串输入并仅在发生整数输入时执行逻辑?scanf()返回成功分配的输入项目数。也就是说,在您的示例中,如果输入了一个数字,1,否则,0。(除非在第一个输入项之前

我使用下面的代码扫描用户输入的整数,直到行尾出现

while (scanf(" %d", &num) != EOF) {
   printf("Do something")
}
在用户输入一个字符串而不是一个整数之前,这是可以正常工作的。然后,该程序将无休止地打印
并执行某些操作。为什么会这样

如何仅在发生行尾时停止循环,而忽略字符串输入并仅在发生整数输入时执行逻辑?

scanf()
返回成功分配的输入项目数。也就是说,在您的示例中,如果输入了一个数字,
1
,否则,
0
。(除非在第一个输入项之前发生输入错误,在这种情况下,它返回
EOF

如果输入了字符串,则该字符串与
%d
不匹配,
scanf()
返回零,输入循环,打印
“Do something”
,然后再次调用
scanf()

但是字符串没有被任何输入函数使用

因此字符串无法匹配,
将打印“做点什么”
。。。你明白了

很高兴您没有访问
num
,因为如果您事先没有初始化它,访问它将是未定义的行为(因为它仍然没有初始化)

一般来说,不要对可能存在格式错误的(用户)输入使用
scanf()。根据偏好,使用
fgets()
读取整行用户输入,然后在内存中使用例如
strtol()
strtof()
strtok()
或任何适当的方法对其进行解析——这允许您回溯,准确地确定输入未达到预期的点,并打印包含完整输入的有意义的错误消息

如何仅在行结束时停止循环,而忽略字符串输入并仅在发生整数输入时执行逻辑

scanf(“%d”,&num)
返回0时,读取一个字符并抛出它

int count;
while ((count = scanf("%d", &num)) != EOF) {
  if (count > 0) printf("Do something with %d\n", num);
  else getchar();
}
scanf(“%d”,&num)
返回0时,读取单个字符。