|
发表于 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。
如果不明白,继续跟帖。 |
|