鱼C论坛

 找回密码
 立即注册
查看: 2602|回复: 6

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

[复制链接]
发表于 2019-1-24 12:23:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
别说了,又是看不懂代码系列,这是个要求将字符串中的值解析为对应的整型数字的程序就是类似 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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类型的数值,直接和前面的结果相加,放到个位的位置上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-25 09:00:02 | 显示全部楼层

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-25 14:32:28 From FishC Mobile | 显示全部楼层
漫漫C仔 发表于 2019-1-25 09:00
if (ch >= '0' && ch

你自己先试试画出这段代码的流程图看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 码表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-26 07:58:39 | 显示全部楼层

首先从“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。

如果不明白,继续跟帖。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-2 09:43:55 | 显示全部楼层
行客 发表于 2019-1-26 07:58
首先从“if (ch >= '0' && ch

那么就是说它是按一个个数字来进行循环的是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 06:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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