问大家一个C语言问题。下面的将字符转换成数值是怎么转换的啊,看不懂,请大家帮帮忙啊,

来源:百度知道 编辑:UC知道 时间:2024/05/07 08:01:15
#include <stdio.h>
main( )
{ int flag=0,i=0;
long num=0;
char str[ ]={"-1688"}; /*将数字字符串放在一维字符数组s中*/
while(str[i]!='\0')
{ if(str[i]=='-')
flag=1; /*判断数的正负,为-表示负数*/
else
if (str[i]=='+')
flag=0; /*判断数的正负,为+表示正数*/
else
num=num*10+(str[i]-'0'); /*将字符转换成数值*/
i++;
}
if (flag==1) num=-num;
printf("\n由数字字符串转换成的整数是:%ld", num);
}

num=num*10+(str[i]-'0');
这一句实现了字符串到数字的转化。
首先:char型都有个ASCII码值,str[i]-'0'就把数字字符便成了相应的数字值。

再者:num=num*10+每次读到一个数字,就把num乘10,再加上这个数字,由于是从高位读取的,就还原出了这个数。就像23可以分解成:2*10+3一样,逐步分解的反向操作,就合成了数字。

循环中其他语句都是为了判断数字的正负符号。

再在if (flag==1) num=-num;的时候把正数变成负数。

num=num*10+(str[i]-'0'); /*将字符转换成数值*/

关键就是这一句,str[i]-'0'是在计算字符str[i]和字符'0'的ASCII码的差,如果str[i]是一个数字字符,那么这个差就正好等于str[i]所表示的数字。

num=num*10+(str[i]-'0'); /*将字符转换成数值*/
是因为,c语言中字符是以ascII码形式存放的,它可以作为数值进行加减运算,而且字符'0'至'9'是连续的,也就是说字符'1'与字符'0'做差后其值为数字1;
所以(str[i]-'0')是求出当前位的数值.NUM=NUM*10是因为每多一个数,说明它前面的数位将高一位.这样,我们先看一下它的执行过程:
表 达 式: i str[i] (str[i]-'0') num
第一次循环 0 '-' 不执行 0
第二次 1 '1' 1 1
... 2 '6' 6 16
... 3 '8' 8 168
...