这里有一个类似的问题(这个问题的基础)
Check if input is integer type in C及相关回答https://stackoverflow.com/a/4072483/3395716
不同之处在于,在该答案中只检查了一个整数,但我想检查多个数字然后退出。
我修改了这个程序,
//variable declaration
flag=0;
if(scanf("%d%c", &A, &term) != 2 || term != '\n')
{
flag=1;
}
if(scanf("%d%c",&B, &term) != 2 || term != '\n')
{
flag=1;
}
if(scanf("%d%c",&C,&term) != 2 || term != '\n')
{
flag=1;
}
if(flag==1)
{
printf("failure\n");
return 0;
}
问题是,程序不会等待所有数字被输入,而是如果第一个输入无效,它只会打印failure
。
我该怎么办?
编辑: 示例输入和输出
5
6
7
output:nothing
预期
input:
5
f
7
output:failure
会发生什么
5
f
output:failure
答案 0 :(得分:3)
问题是如果输入无效,scanf
函数将不读取输入,它将留在输入缓冲区中,用于下一个输入函数,案例将以相同的输入失败。
我建议您使用例如fgets
阅读整行,然后使用例如sscanf
(或strtol
)将字符串转换为数字。
答案 1 :(得分:1)
问题在于:如果用户输入A
并按Enter键,则第一个scanf
会失败,因为它会看到A
,但是A
保留在输入流中。因此,第二个和第三个scanf
也会看到A
并立即失败。
通常,如果您需要强制执行面向行的协议,则应使用fgets
读取一行,并使用sscanf
和/或strto*
系列函数进行转换。
答案 2 :(得分:0)
scanf("%d ...
读取无效字符'f'
,但看到它不是int
的预期部分(因为"%d"
}),取消角色,将其重新放回stdin
进行后续阅读/扫描。
因此,在某些内容消耗'f'
之前,使用scanf("%d%c", ...
的其他来电不会改变事物的状态。
最好使用fgets()
(C标准)或getline()
(常见,但不是标准)来阅读用户输入。