鱼C论坛

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

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

[复制链接]
发表于 2018-12-19 18:38:12 | 显示全部楼层 |阅读模式
9鱼币
下面是小甲鱼写的一段实现 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里面已经有值得话就退出循环了

最佳答案

查看完整内容

我不是大神,但就这个代码来说还是略微懂点 首先咱们要明白 atoi 这个函数到底是干嘛用的,详情参考小甲鱼函数快查 atoi 函数的介绍 好的,咱们入正题,首先提示用户输入一个待转换的字符串,这里咱们假设输入字符 ‘1’ ‘2’ ‘3’吧 然后进入循环,getchar先读取一个,也就是读取字符1,然后把这个字符1赋值给整形变量ch,也就是说 把字符1的ascii码给了ch,因为ch是整形嘛,不能存放字符1,然后继续进入if,判断ch ...
想知道小甲鱼最近在做啥?请访问 -> 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里面已经有值得话就退出循环了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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,说明已经读取完毕,直接跳出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 02:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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