漫漫C仔 发表于 2019-1-24 12:23:51

啊,看不懂小甲鱼写的代码QAQ

别说了,又是看不懂代码系列,这是个要求将字符串中的值解析为对应的整型数字的程序就是类似 atoi 函数的函数
#include <stdio.h>

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

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

      do
      {
                ch = getchar();

                if (ch >= '0' && ch <= '9')//从这里开始我就开始懵逼了为什么这样?
                {
                        num = 10 * num + (ch - '0');//这为什么要*10还要+(ch-'0')?
                }
                else
                {
                        if (num)
                        {
                              break; // 如果已有数字,则退出循环
                        }
                }

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

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

      return 0;
}

BngThea 发表于 2019-1-24 12:32:38

if (ch >= '0' && ch <= '9')//从这里开始我就开始懵逼了为什么这样?
因为要转换的字符必须是数字0-9才行

num = 10 * num + (ch - '0');//这为什么要*10还要+(ch-'0')?
因为是从高位依次转换,所以每转换一位要将其位置往高位移动一位,所以 *10
后面的ch-'0'得到的是一个int类型的数值,直接和前面的结果相加,放到个位的位置上

漫漫C仔 发表于 2019-1-25 09:00:02

BngThea 发表于 2019-1-24 12:32
if (ch >= '0' && ch

if (ch >= '0' && ch <= '9')//这个东西是从个位开始看的还是说从小数点之后看的?

num = 10 * num + (ch - '0');//这为什么要*10还要+(ch-'0')?//你说的意思是将小数点后面的数字*10然后加到个位???

BngThea 发表于 2019-1-25 14:32:28

漫漫C仔 发表于 2019-1-25 09:00
if (ch >= '0' && ch

你自己先试试画出这段代码的流程图看看

新建word 发表于 2019-1-25 16:11:18

    if (ch >= '0' && ch <= '9')//从这里开始我就开始懵逼了为什么这样?
                {
                        num = 10 * num + (ch - '0');//这为什么要*10还要+(ch-'0')?
                }
直接拷贝你的 代码 来解释这段代码的意思
if判断 输入的 ch 变量 是否 大于等于0 以及小于等于 9   通俗的说判断变量 ch是否为数字
下面的 num的话 就是 把输入的 ch 变量转换成int 格式   建议你可以去查查ascii 码表

行客 发表于 2019-1-26 07:58:39

漫漫C仔 发表于 2019-1-25 09:00
if (ch >= '0' && ch

首先从“if (ch >= '0' && ch <= '9')//这个东西是从个位开始看的还是说从小数点之后看的?”说起:
明确答复:不是的,这个和小数点没有关系。这个是判断你输入的字符串中的每一个字符是否是0-9之间的整型数字。

在开始之前,建议你先打开一个asiic码对照表。然后再看下面的解释:

因为你输入的字符,ch = getchar();获得的ch值是字符的ASII码的对应的进制值。
建议你先把代码修改如下:
#include <stdio.h>

int main()
{
        int ch;
        int num = 0;
       
        printf("请输入待转换的字符串:");
       
        do
        {
                ch = getchar();
                printf("十进制值为%d\n",ch);        //加入这句代码,是为了你更好理解ch的值到底是什么
               
                if (ch >= '0' && ch <= '9')//从这里开始我就开始懵逼了为什么这样?
                {
                        num = 10 * num + (ch - '0');//这为什么要*10还要+(ch-'0')?
                }
                else
                {
                        if (num)
                        {
                                break; // 如果已有数字,则退出循环
                        }
                }
               
        }
        while (ch != '\n');
       
        printf("结果是:%d\n", num);
       
        return 0;
}
上面的这段代码,我们在ch = getchar();下,增加了
printf("十进制值为%d\n",ch);        //加入这句代码,是为了你更好理解ch的值到底是什么



好,我们编译执行,输入待转换的字符串为123,我们回车后,会发现输出:

请输入待转换的字符串:123
十进制值为49
十进制值为50
十进制值为51
十进制值为10
结果是:123

十进制值为49为数字1;十进制值为50为数字2,十进制值为51为数字3。
十进制值为10是你的回车换行。

那么好,相信你看到这里,明白为什么 (ch - '0')了。
(ch - '0'),'0'的十进制是48,所以用(ch - '0'),就如当ch是1时,49-48获得了真实的对应数字1。

好,接下来的问题就很简单了:

如果我们输入的字符串是“123”;那么我们在do...while循环中,第一次ch=49,num = 10 * num + (ch - '0');这句话得到的值是
num = 10 * 0 + (49 - 48);
这时,num=1;这时的num是个位
第二次循环,如果我们再遇到输入的是数字,上面循环的num就应该成为十位了;第三次循环就应该成为百位了。所以要每次循环,遇到数字都乘以10。

如果不明白,继续跟帖。

漫漫C仔 发表于 2019-2-2 09:43:55

行客 发表于 2019-1-26 07:58
首先从“if (ch >= '0' && ch

那么就是说它是按一个个数字来进行循环的是吗?
页: [1]
查看完整版本: 啊,看不懂小甲鱼写的代码QAQ