你的两种猜想都不对。
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;
- }
复制代码