JackII 发表于 2020-3-28 00:37:55

关于while函数的疑问

为什么我输入1、2、3.9程序给出的答案是6?
我的第一种猜想,程序识别出了读取类型的错误,并把3.9转换为了3储存在integer中,那么应当在下一次进入while循环前的条件测试测试出该_Bool值为0,终止程序,则得出答案3,而不是6。
第二种猜想,程序没有识别出读取类型错误,也是把3.9转换为了3储存在integer中,并执行下一次while循环,但是这样的话程序不应该终止。
所以我自己提出的两种猜想都自相矛盾,请问有人能告诉我怎么回事,或者我的猜想存在的问题吗?

JackII 发表于 2020-3-28 00:39:00

为了不显得太凌乱,我把代码单独发出来:
#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;
}

sunrise085 发表于 2020-3-28 01:14:18

你的两种猜想都不对。
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]
查看完整版本: 关于while函数的疑问