关于while函数的疑问
为什么我输入1、2、3.9程序给出的答案是6?我的第一种猜想,程序识别出了读取类型的错误,并把3.9转换为了3储存在integer中,那么应当在下一次进入while循环前的条件测试测试出该_Bool值为0,终止程序,则得出答案3,而不是6。
第二种猜想,程序没有识别出读取类型错误,也是把3.9转换为了3储存在integer中,并执行下一次while循环,但是这样的话程序不应该终止。
所以我自己提出的两种猜想都自相矛盾,请问有人能告诉我怎么回事,或者我的猜想存在的问题吗?
为了不显得太凌乱,我把代码单独发出来:
#include <stdio.h>
int main()
{
printf("Hello!Welcome to test this program!\n");
long int sum = 0, integer=0;
_Bool input_is_good =1;
while (input_is_good)
{
sum = sum + integer;
printf("Please input a integer(q to quit):");
input_is_good = (scanf("%d", &integer)==1);//'=='优先级高于'=',==1表示%d读取了正确值(即整数)
}
printf("Those sum is %d\n",sum);
return 0;
}
你的两种猜想都不对。
scanf不是读到空白符(空格、Tab和回车)才判断格式是否正确
到第三次循环的时候程序只读到'3.',然后发现第二个字符已经不是int了,将之返回缓冲区,然后将3赋值给integer,scanf返回值为1;
到第四次循环的时候,缓冲区的内容是'.9',scanf读到'.',发现类型不对,没读到有效的内容,无法给integer赋值,同时scanf的返回值为0
这个你可以在循环中添加一个记录循环次数的变量,看一下就知道了。
还可以看一下缓冲区的下一个字符。
#include <stdio.h>
int main()
{
printf("Hello!Welcome to test this program!\n");
long int sum = 0, integer=0,i=0;
int input_is_good =1;
char ch;
while (input_is_good)
{
sum = sum + integer;
printf("Please input a integer(q to quit):");
input_is_good = (scanf("%ld", &integer)==1);//'=='优先级高于'=',==1表示%d读取了正确值(即整数)
ch=getchar();// 读取一个字符
printf("ch=%c\n",ch);
ungetc(ch, stdin);// 将ch退回到缓冲区
i++;
}
printf("Those sum is %ld\n",sum);
printf("Time is %ld\n",i);
return 0;
}
页:
[1]