我不懂K& R C书中的atoi功能?

时间:2012-01-20 16:10:09

标签: c atoi

#include <stdio.h>
#include <string.h>

int main(void)
{
    char s[]= "9";
    printf("atoi = %d",atoi(s));
    system("pause");
    return 0;
}

int atoi(char s[])
{
    int i=0,n=0;

    for(i;s[i]>='0' && s[i]<='9';i++)
        n=10*n + (s[i]-'0');
    return n;

}

在上面的程序中,它根据程序给出了结果9,它应该打印9的ascii值 我不明白这个for循环是做什么的。

for(i;s[i]>='0' && s[i]<='9';i++)
n = 10*n + (s[i]-'0');

3 个答案:

答案 0 :(得分:4)

让我们打破这个:

for (i;

这会创建一个for循环,循环变量为i。这不是必需的,而是更多的编码风格。

s[i] >= '0' && s[i] <= '9'

检查以确保该索引处的字符在十进制字符(0 - 9)的范围内,如果不是,则退出循环,然后返回该数字。

i++

循环运行后,这会将您在字符串中检查的索引增加一个。

n = 10 * n

这会在'n'上加一个额外的数字乘以10,因为你知道如果你的数字中还有一个字符,那么它必须乘以10(比如我开始解析100,我读前两个字符串) ,并且有10个,还有一个字符,所以我乘以10得到100。

+ (s[i]-'0');

这会将下一个数字添加到'n',即结果,通过将当前索引处的字符减去'0'来确定,当在0到9的范围内时,返回该数字的整数(如果这让您感到困惑,请查看ASCII Chart

希望这有助于您理解。

答案 1 :(得分:3)

这将字符串表示转换为类似“329”到329的数字 首先需要3个然后3 * 10 + 2 = 32个 那么32 * 10 + 9 = 329

答案 2 :(得分:0)

for(i;s[i]>='0' && s[i]<='9';i++) /* loop over just the digits, in L->R order */
    n = 10*n + (s[i]-'0');        /* Take value so far, "shift" a 10's place left, 
                                     and add in value of latest digit
                                     (diff between ASCII of digit & ASCII of zero) */