/ 程序添加两个整数,如果输入不是整数打印无效输出 /
#include <stdio.h>
int main()
{
int num1,num2,flag=0,sum;
char chek,chek2;
/* To check input value a integer or not*/
if(scanf("%d%c", &num1, &chek);!= 2 || chek != '\n')
{
flag=flag+1;
}
if(scanf("%d%c", &num2, &chek2) != 2 || chek2 != '\n')
{
flag=flag+1;
}
if(flag!=0)
printf("invalid input\n");
else
{
sum=num1+num2;
printf("the sum is:%d",sum);
}
return 0;
}
答案 0 :(得分:0)
scanf
函数返回读取的项目数,或者更简单的说,返回分配给您的格式字符串的项目。
如果输入一个字符,则第一个scanf将返回0,因为它希望匹配一个数字并且if语句立即执行。当它到达下一个scanf时,stdin中仍有数据,因为初始字符与第一个scanf不匹配,所以它也会使第二个字符返回0.这就是为什么你在第一个字符后打印的消息输入
如果您总是想要输入第二个数字,即使第一个数字无效,您还需要确保清除stdin缓冲区,以便它可以阻止第二个数字,并等待您输入新数据。有一个名为fflush的函数可以像fflush(stdin)
一样调用,但它的行为是非常不明确的,你不应该依赖它来做任何事情。
我会用一点点黑客发布你的代码,以使程序能够正常运行。
#include <stdio.h>
int main() {
int num1,num2,flag=0,sum;
char chek,chek2;
if( scanf("%d%c", &num1, &chek) != 2 || chek != '\n')
{
flag = flag + 1;
//Ugly hack to clear the stin buffer
char ch;
while ((ch = getchar()) != EOF && ch != '\n');
}
if( scanf("%d%c", &num2, &chek2) != 2 || chek2 != '\n')
{
flag = flag + 1;
}
if(flag!=0) {
printf("invalid input\n");
} else {
sum = num1 + num2;
printf("the sum is:%d\n", sum);
}
return 0;
}
我所做的是尝试从stdin读取所有内容,直到找到新行或文件结尾。这样缓冲区为空,下一个scanf不会尝试匹配上次输入的任何剩余数据。