我叫MD 发表于 2018-12-19 18:38:12

跪求大神给分析一下以下代码

下面是小甲鱼写的一段实现 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 *num 是什么意思,按理说10 * 0 不还是0吗?为什么多此一举
                }
                else
                {
                        if (num)//其次是这里,if(num) 什么意思没看懂,if(0)?为什么这样写?
                        {
                              break; // 如果已有数字,则退出循环
                        }
                }

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

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

      return 0;
}

有大神的路过的话希望能详细的把每一行的注释都给写一下,在下感激不尽!在此先行谢过了

啊涂涂 发表于 2018-12-19 18:38:13

我不是大神,但就这个代码来说还是略微懂点

首先咱们要明白 atoi 这个函数到底是干嘛用的,详情参考小甲鱼函数快查 atoi 函数的介绍

好的,咱们入正题,首先提示用户输入一个待转换的字符串,这里咱们假设输入字符 ‘1’ ‘2’ ‘3’吧

然后进入循环,getchar先读取一个,也就是读取字符1,然后把这个字符1赋值给整形变量ch,也就是说

把字符1的ascii码给了ch,因为ch是整形嘛,不能存放字符1,然后继续进入if,判断ch里面这个东西

是不是一个有效数字,既然是1,那肯定是有效数字,进入if,关键就在于这个进入if之后,咱们最后输出

是按照一个整形输出的,什么意思?就是直接输出123,那现在只有一个1,23都还没有呢,这里运用了一个

很巧妙的方法,让num每次都乘以10,当然了,第一次进入if的话,是10 * 0,等于还是0,运算完的话

num 是等于1的,但下一次等2进来的时候就不一样了,表达式变成了 num = 10 * 1 + (ch - ‘0’),

运算的结果num = 12,再进入一次就是 num = 10 * 12 + (ch - ‘0’),num就得到了我们最终想要的结果

字符123成功的变成了整形123,然后if(num)这里是保证了循环退出的条件,当接受的不再是有效数字

并且num里面已经有值得话就退出循环了

Croper 发表于 2018-12-19 19:04:36

首先。。看清楚代码。。这是一个do while循环,num不一定是0。。
然后接下来就好理解了
num = 10 * num + (ch - '0');   //首先是这里 10 *num 是什么意思,按理说10 * 0 不还是0吗?为什么多此一举
这是左移一位,然后把char里的数字添加到个位
                        if (num)//其次是这里,if(num) 什么意思没看懂,if(0)?为什么这样写?
                        {
                              break; // 如果已有数字,则退出循环
                        }
,现在读取的char不是数字了,如果num为0,说明还没有读取数字,就继续读取下一位,
如果num不为0,说明已经读取完毕,直接跳出循环
页: [1]
查看完整版本: 跪求大神给分析一下以下代码