张小艾 发表于 2020-3-1 16:22:48

关于do while

#include <stdio.h>

int main()
{
      int ch;
      int num = 0;

      printf("请输入待转换的字符串:");

      do
      {
                ch = getchar();

                if (ch >= '0' && ch <= '9')
                {
                        num = 10 * num + (ch - '0');
                }
                else
                {
                        if (num)
                        {
                              break; // 如果已有数字,则退出循环
                        }
                }

      }
      while (ch != '\n');

      printf("结果是:%d\n", num);

      return 0;
}

这个是课后作业13里面的,表示看不懂那个(ch-'0'),
还有else
                {
                        if (num)
                        {
                              break; // 如果已有数字,则退出循环
                        }
                }这一段又什么用啊?我删了之后代码还可以照常运行的啊{:10_266:}

SHRS23 发表于 2020-3-1 16:57:54

第一个问题:(ch-'0')的用处
ch = getchar(); getchar返回的是一个字符类型,如果你输入5,实际上ch里存储是字符'5' 对照ASCII码就是十进制的53
而后续程序中需要用字符‘5’的数值5来计算,转换方法就是ch-'0' 字符'0'的ASCII码是48 这样53-48就是数值5
如果你熟悉ASCII码可以直接写成 ch - 48 ,如果你不熟悉那就用 ch-'0' 实际效果是一样的。

第二个问题:
这段代码的用处是 如果你想输入的是12345 但是你输完了123突然按错了按了一个e
这个时候程序就会进入这一段代码,此时num不是0直接跳出循环,然后输出。
这段代码的用处就是实现了一个按除数字键以外的任意键结束程序输出结果的功能。

SHRS23 发表于 2020-3-1 17:04:46

补充一下,字符0~字符9 在ASCII中是按顺序排下来的,对应十进制是48~57
所以任何一个数字字符减去字符0 得到的都是数字字符本身所代表的数字值

同理这一点也可以用在大小写转换上,不需要查具体的表,我们只需要直到字符A~字符Z和
字符a~字符z都是按顺序排列的,('a' - 'A' )就是想大写转换为小写的差值,这时候任意一个大写字母
只需要加上这个差值就能得到他对应的小写字母 'F' + ('a' - 'A' ) = ‘f’

张小艾 发表于 2020-3-1 17:30:45

SHRS23 发表于 2020-3-1 16:57
第一个问题:(ch-'0')的用处
ch = getchar(); getchar返回的是一个字符类型,如果你输入5,实际上ch里存 ...

谢谢大佬_(:з」∠)_
页: [1]
查看完整版本: 关于do while