鱼C论坛

 找回密码
 立即注册
查看: 1617|回复: 2

[已解决]跪求大神给分析一下以下代码

[复制链接]
发表于 2018-12-19 18:38:12 | 显示全部楼层 |阅读模式
9鱼币
下面是小甲鱼写的一段实现 atoi 函数的代码,看的不是很懂,有大神给详细注释一下吗?
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int ch;
  5.         int num = 0;

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

  7.         do
  8.         {
  9.                 ch = getchar();

  10.                 if (ch >= '0' && ch <= '9')
  11.                 {
  12.                         num = 10 * num + (ch - '0');   //首先是这里 10 *num 是什么意思,按理说10 * 0 不还是0吗?为什么多此一举
  13.                 }
  14.                 else
  15.                 {
  16.                         if (num)  //其次是这里,if(num) 什么意思没看懂,if(0)?为什么这样写?
  17.                         {
  18.                                 break; // 如果已有数字,则退出循环
  19.                         }
  20.                 }

  21.         }
  22.         while (ch != '\n');

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

  24.         return 0;
  25. }
复制代码


有大神的路过的话希望能详细的把每一行的注释都给写一下,在下感激不尽!在此先行谢过了
最佳答案
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里面已经有值得话就退出循环了

最佳答案

查看完整内容

我不是大神,但就这个代码来说还是略微懂点 首先咱们要明白 atoi 这个函数到底是干嘛用的,详情参考小甲鱼函数快查 atoi 函数的介绍 好的,咱们入正题,首先提示用户输入一个待转换的字符串,这里咱们假设输入字符 ‘1’ ‘2’ ‘3’吧 然后进入循环,getchar先读取一个,也就是读取字符1,然后把这个字符1赋值给整形变量ch,也就是说 把字符1的ascii码给了ch,因为ch是整形嘛,不能存放字符1,然后继续进入if,判断ch ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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里面已经有值得话就退出循环了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-19 19:04:36 | 显示全部楼层
首先。。看清楚代码。。这是一个do while循环,num不一定是0。。
然后接下来就好理解了
  1. num = 10 * num + (ch - '0');   //首先是这里 10 *num 是什么意思,按理说10 * 0 不还是0吗?为什么多此一举
复制代码

这是左移一位,然后把char里的数字添加到个位
  1.                         if (num)  //其次是这里,if(num) 什么意思没看懂,if(0)?为什么这样写?
  2.                         {
  3.                                 break; // 如果已有数字,则退出循环
  4.                         }
复制代码

,现在读取的char不是数字了,如果num为0,说明还没有读取数字,就继续读取下一位,
如果num不为0,说明已经读取完毕,直接跳出循环
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 17:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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