鱼C论坛

 找回密码
 立即注册
查看: 956|回复: 2

[已解决]关于while函数的疑问

[复制链接]
发表于 2020-3-28 00:37:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

这是执行效果图

这是执行效果图

这是代码

这是代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 17:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表