【发布时间】:2021-06-09 11:35:32
【问题描述】:
是的,SO 上已经存在类似的问题,scanf() 在“解释”回车键之前不会等待用户输入,但我的问题是这个问题只发生在扫描时——即@987654322 @(前面有一个空格)——读取一个字符串而不是另一个长数字。如果此摘要看起来令人费解,请在下方查看详细信息。
我在 C 中有以下程序:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
long int cardnum, tmp;
int num_of_digits;
bool validate; // valid value
LOOP:do
{
printf("Number: ");
scanf(" %ld", &cardnum);
tmp = cardnum, num_of_digits = 0;
while (tmp != 0)
{
tmp /= 10;
++num_of_digits;
}
if (num_of_digits != 16)
{
printf("INVALID\n");
goto LOOP;
}
validate = false;
// ... (validate will be processed here, and there will be a case where "validate" will be true)
}
while (validate != true);
}
输入:
-
4003600000000014:有效,长度为16 -
400360000000001:打印INVALID,长度为15 -
asdf:无限循环(请注意并非所有无效输入都会导致此错误!)
Number: INVALID
Number: INVALID
Number: INVALID
...
我在其他地方读到scanf 忽略了最后一行缓冲区(或其他内容),但在我的情况下,它只发生在scanf 没有从用户那里收到正确的输入类型时。有人可以帮忙吗?
提前致谢。
【问题讨论】:
-
那么你想要在
asdf上发生什么?goto LOOP;这太可怕了,不要使用 goto。只需continue。 -
格式说明符之前的那个空格对我来说从来没有用过,所以它卡在标准输入的换行符上,更简单的方法是使用
getchar()将其从那里取出,更好的做法是使用fgets阅读并将其转换为int -
@KamilCuk 如果输入了
asdf,我想让用户再次输入。goto的目的是不进入以下流程以进行优化。如果有一个功能相同但“更好”的功能,请告诉我 -
@VladfromMoscow 编辑问题,感谢您的关注
-
@LEF,格式字符串中的文字空格字符匹配输入中相应点出现的空格,包括没有空格。但是,大多数转换说明符,包括
%d,无论如何都会忽略任何前导空格,因此格式" %ld"与"%ld"匹配的输入完全相同。