我正在尝试处理人为错误,如果我输入错误的输入(如浮点值),程序会再次提示输入。
我是通过检查scanf
是否未返回正确的扫描输入数量(此处为3)然后再次询问来完成此操作。
但是,如果输入“5.4(float)3 2”或“4 5.4(float)3”作为输入,则获得无限循环,如果输入“5 4 3.2”,则获取int值。
我想知道为什么会这样。
我知道使用多个scanf
的解决方法。但我想知道原因。
这是我的代码:
#include <stdio.h>
int main(){
int a,b,c,largest,error;
do{
printf("Enter three numbers to find largest:");
error = scanf("%d %d %d",&a,&b,&c);
}while(error != 3);
}
答案 0 :(得分:0)
我知道最简单的方法是读取字符串行,然后你必须尝试将其转换为数据类型。
在这种情况下,例如,如果您找到“。”或“,”你可以显示错误消息。
要将字符串转换为数据类型,您可以使用sscanf
如果使用scanf,某些字符可以保留在stdin(标准输入)缓冲区中,因此下次使用scanf时可以获得旧字符。
答案 1 :(得分:0)
"5.4 3 2"
和"4 5.4 3"
是相对简单的顶级句柄,因为当&#39;。&#39;由scanf()
消耗,它立即得知必定有错误。
然而,"4 3 5.4"
并非如此微不足道。在scanf()
消耗"4 3 5"
后,它会返回3以表示已成功扫描3个整数,并在".4"
中保留stdin
。因此,对于这种情况,scanf()
的返回值不就足够了。
这是我的代码:
#include <stdio.h>
int main(void)
{
int a, b, c, error;
do
{
printf("Enter three numbers to find largest:");
error = scanf(" %d %d %d", &a, &b, &c);
if (getchar() != '\n')
{
error = 0;
scanf("%*[^\n]");
}
}
while(error != 3);
return 0;
}
scanf("%*[^\n]");
用于丢弃stdin
中的所有字符,直到&#39; \ n&#39;。导致"%d %d %d"
的空格告诉scanf()
丢弃一个或多个空白字符(包括&#39;&#39;&#39; \ n&#39;和&#39; \ t&# 39;)直到满足第一个非空白字符。
事实上,您甚至不必检查scanf()
的返回值:
#include <stdio.h>
int main(void)
{
int a, b, c;
for(;;)
{
printf("Enter three numbers to find largest:");
scanf(" %d %d %d", &a, &b, &c);
if (getchar() == '\n')
{
break; // successful
}
scanf("%*[^\n]");
}
return 0;
}