在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时,读取单个字符。