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

#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;的时候把正数变成负数。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-04-13
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
... 4 '8' 8 1688
... 5 '\0' 退出
第2个回答  2008-04-13
原理楼上4位已经说得很明白了,我来代码吧.
还有,你是想问字符串转数字吧?
字符转的方法: char c = '1'; int n = c - '0'; n 就是 1

字符串的:

#include <iostream>
using namespace std;

int StrToInt( char *s )
{
char *p = s;
int i = 0, k = 1;
while( *s ) s++;
s--;
while( s >= p )
{
i += (*s - '0')* k ;
k *= 10;
s --;
}
return i;
}
int main()
{
cout<< StrToInt( "1234" ) <<endl;
return 0;
}
第3个回答  2008-04-13
num=num*10+(str[i]-'0'); /*将字符转换成数值*/

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