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