鱼C论坛

 找回密码
 立即注册
查看: 4277|回复: 19

[已解决]while循环

[复制链接]
发表于 2022-5-11 14:14:30 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

int main()
{
    int ch,i=0;
    _Bool k=1;
    while(k)
    {
        printf("请输入合法数字:");
        while((ch=getchar())!='\n')
        {
            if(ch>='0'&&ch<='9')
            {
                i=i+ch-'0';
            }
            else
            {
                k=0;
               break;
            }
        }
    }
    printf("结果是%d\n",i);

    return 0;
}

功能已实现
但当我这样调试:
请输入合法数字:20
请输入合法数字:20
请输入合法数字:f
结果是4

为什么会出现这样的结果,当我输入超过个位数时不应该执行break,输出0吗?就像我一开始输入字母一样,输出就为0.
最佳答案
2022-5-11 17:02:05
Weabu 发表于 2022-5-11 16:46
我想输入只能是个位数,如果用户输入超过个位数,报错或直接结束循环
我现在遇到的问题是我运行请输入合 ...



这样的需求可以不用循环吧,参考代码:
#include <stdio.h>

int main()
{
    int ch, i = 0;

    printf("请输入合法数字:");
    ch = getchar();

    if (ch >= '0' && ch <= '9' && getchar() == '\n'){
        i = i + ch - '0';
        printf("结果是%d\n", i);
    }
    else{
        printf("你输入的数值不合法!\n");

    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-11 14:38:30 | 显示全部楼层

你想实现的功能是什么呢?

最终结果打印 4 应该是因为 i 循环过程中没有初始化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-11 16:40:38 | 显示全部楼层

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-11 16:46:29 | 显示全部楼层
Twilight6 发表于 2022-5-11 14:38
你想实现的功能是什么呢?

最终结果打印 4 应该是因为 i 循环过程中没有初始化

我想输入只能是个位数,如果用户输入超过个位数,报错或直接结束循环
我现在遇到的问题是我运行请输入合法数字:56
                                       请输入合法数字:56
                                       请输入合法数字:h
                                       结果是22
运算过程是5+6+5+6=22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-11 17:02:05 | 显示全部楼层    本楼为最佳答案   
Weabu 发表于 2022-5-11 16:46
我想输入只能是个位数,如果用户输入超过个位数,报错或直接结束循环
我现在遇到的问题是我运行请输入合 ...



这样的需求可以不用循环吧,参考代码:
#include <stdio.h>

int main()
{
    int ch, i = 0;

    printf("请输入合法数字:");
    ch = getchar();

    if (ch >= '0' && ch <= '9' && getchar() == '\n'){
        i = i + ch - '0';
        printf("结果是%d\n", i);
    }
    else{
        printf("你输入的数值不合法!\n");

    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-11 17:14:50 | 显示全部楼层
#include <stdio.h>

int main()
{
    int num=0;
    long sum =0L;
    int status;
    do
    {
        printf("请输入合法数字:");
        sum=sum+num;
        status=scanf("%d",&num);
        
    } while (status==1);
    printf("结果是%ld\n",sum);
   
    return 0;
}

这个的while的循环条件是怎么理解啊
如果当我输入为3的时候status不应该为3吗,不符合循环条件才对啊
为什么代码还是实现了功能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-11 17:16:40 | 显示全部楼层
Twilight6 发表于 2022-5-11 17:02
这样的需求可以不用循环吧,参考代码:

而且我调换11 12行位置输出的结果为什么是不一样的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-11 17:41:35 | 显示全部楼层

scanf返回值是成功赋值的元素个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-11 18:11:08 | 显示全部楼层
Weabu 发表于 2022-5-11 17:16
而且我调换11 12行位置输出的结果为什么是不一样的呢


scanf 函数的返回值是用户输入的数据与格式字符串中成功匹配次数

你这里 %d 只进行一次格式化,那么久返回 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 10:29:22 | 显示全部楼层
Twilight6 发表于 2022-5-11 18:11
scanf 函数的返回值是用户输入的数据与格式字符串中成功匹配次数

你这里 %d 只进行一次格式化,那么 ...

那scanf("%d",&num)
是也还给num赋值了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 10:33:30 | 显示全部楼层
Weabu 发表于 2022-5-12 10:29
那scanf("%d",&num)
是也还给num赋值了吗



是的

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 10:36:00 | 显示全部楼层

那为什么我调换11和12行代码位置,输出的结果却不一样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 10:37:56 | 显示全部楼层
Weabu 发表于 2022-5-12 10:36
那为什么我调换11和12行代码位置,输出的结果却不一样了




是因为你这先打印 i 值,再进行计算 i 的值,自然就不同了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 10:44:43 | 显示全部楼层
Twilight6 发表于 2022-5-12 10:37
是因为你这先打印 i 值,再进行计算 i 的值,自然就不同了

没调转之前逻辑:输入3
                          sum=0+3=3
                          status=1,num=3
                          循环
                          输入3
                          sum=3+3=6
                          status=1,num=3
                          循环
                          输入f
                          退出循环
                          输出6
调换后
                           输入3
                            status=1,num=3
                            sum=0+3=3
                            循环
                             输入3
                             statue=1,num=3
                             sum=3+3=6
                             循环
                             输入f
                              退出循环
                              输出6

可是为什么输出为9 呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 10:48:05 | 显示全部楼层
Weabu 发表于 2022-5-12 10:44
没调转之前逻辑:输入3
                          sum=0+3=3
                          status=1,num ...



你是指哪个代码,我发现我们好像不在一个频道了哈哈尴尬,把你代码再发一次吧

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 10:48:14 | 显示全部楼层
Twilight6 发表于 2022-5-12 10:37
是因为你这先打印 i 值,再进行计算 i 的值,自然就不同了

我多试了几组数,觉得最后一次输入的数多加了一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 10:51:43 | 显示全部楼层
Twilight6 发表于 2022-5-12 10:48
你是指哪个代码,我发现我们好像不在一个频道了哈哈尴尬,把你代码再发一次吧

#include <stdio.h>

int main()
{
    int num=0;
    long sum =0L;
    _Bool status;
    do{
        printf("请输入合法数字:");
        
        status=scanf("%d",&num);
    sum=sum+num;
    } while (status==1);

    printf("结果是%ld\n",sum);
   
    return 0;
}


status=scanf("%d",&num);
    sum=sum+num;
这两行调换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 10:56:15 | 显示全部楼层



对,因为你退出循环要输入 1 ,所以 若 sum=sum+num 这行代码在 scanf 下,就会多 +1

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 11:10:44 | 显示全部楼层
Twilight6 发表于 2022-5-12 10:56
对,因为你退出循环要输入 1 ,所以 若 sum=sum+num 这行代码在 scanf 下,就会多 +1

好的,已经弄明白了
非常感谢耐心解答&#128591;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 11:12:42 | 显示全部楼层
Weabu 发表于 2022-5-12 11:10
好的,已经弄明白了
非常感谢耐心解答&#128591;

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 11:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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