Weabu 发表于 2022-5-11 14:14:30

while循环

#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.

Twilight6 发表于 2022-5-11 14:38:30


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

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

Weabu 发表于 2022-5-11 16:40:38

/Users/dzh/Desktop/1.png

Weabu 发表于 2022-5-11 16:46:29

Twilight6 发表于 2022-5-11 14:38
你想实现的功能是什么呢?

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

我想输入只能是个位数,如果用户输入超过个位数,报错或直接结束循环
我现在遇到的问题是我运行请输入合法数字:56
                                       请输入合法数字:56
                                       请输入合法数字:h
                                       结果是22
运算过程是5+6+5+6=22

Twilight6 发表于 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;
}

Weabu 发表于 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吗,不符合循环条件才对啊
为什么代码还是实现了功能

Weabu 发表于 2022-5-11 17:16:40

Twilight6 发表于 2022-5-11 17:02
这样的需求可以不用循环吧,参考代码:

而且我调换11 12行位置输出的结果为什么是不一样的呢

风车呼呼呼 发表于 2022-5-11 17:41:35

Weabu 发表于 2022-5-11 17:14
#include

int main()


scanf返回值是成功赋值的元素个数

Twilight6 发表于 2022-5-11 18:11:08

Weabu 发表于 2022-5-11 17:16
而且我调换11 12行位置输出的结果为什么是不一样的呢


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

你这里 %d 只进行一次格式化,那么久返回 1

Weabu 发表于 2022-5-12 10:29:22

Twilight6 发表于 2022-5-11 18:11
scanf 函数的返回值是用户输入的数据与格式字符串中成功匹配次数

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

那scanf("%d",&num)
是也还给num赋值了吗

Twilight6 发表于 2022-5-12 10:33:30

Weabu 发表于 2022-5-12 10:29
那scanf("%d",&num)
是也还给num赋值了吗



是的

Weabu 发表于 2022-5-12 10:36:00

Twilight6 发表于 2022-5-12 10:33
是的

那为什么我调换11和12行代码位置,输出的结果却不一样了

Twilight6 发表于 2022-5-12 10:37:56

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



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

Weabu 发表于 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 呢

Twilight6 发表于 2022-5-12 10:48:05

Weabu 发表于 2022-5-12 10:44
没调转之前逻辑:输入3
                        sum=0+3=3
                        status=1,num ...



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

Weabu 发表于 2022-5-12 10:48:14

Twilight6 发表于 2022-5-12 10:37
是因为你这先打印 i 值,再进行计算 i 的值,自然就不同了

我多试了几组数,觉得最后一次输入的数多加了一次

Weabu 发表于 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;
这两行调换

Twilight6 发表于 2022-5-12 10:56:15

Weabu 发表于 2022-5-12 10:51
#include

int main()




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

Weabu 发表于 2022-5-12 11:10:44

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

好的,已经弄明白了
非常感谢耐心解答&#128591;

Twilight6 发表于 2022-5-12 11:12:42

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

{:10_282:}
页: [1]
查看完整版本: while循环