gpt4 book ai didi

c - 当我输入第一个数字作为字母时,为什么我无法输入第二个数字(num2)?

转载 作者:行者123 更新时间:2023-11-30 16:59:52 24 4
gpt4 key购买 nike

/程序将两个整数相加,如果输入不是整数则打印无效输出/

#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;
}

最佳答案

scanf 函数返回读取的项目数,或者更简单地说,返回分配给格式字符串的项目数。

如果你输入一个字符,第一个 scanf 将返回 0,因为它期望匹配一个数字,并且 if 语句会立即执行。当它到达下一个 scanf 时,stdin 中仍然有数据,因为第一个 scanf 与第一个 scanf 不匹配,因此它也会使第二个 scanf 返回 0。这就是为什么您会在第一次输入后打印消息。

如果您总是想输入第二个数字,即使第一个数字无效,您需要确保清除标准输入缓冲区,以便它可以阻塞第二个围巾并等待您输入新数据。有一个名为 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;
}

我所做的是尝试从标准输入中读取所有内容,直到找到新行或文件结尾。这样缓冲区是空的,下一个 scanf 将不会尝试匹配上次输入的任何剩余数据。

关于c - 当我输入第一个数字作为字母时,为什么我无法输入第二个数字(num2)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37932880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com