2
#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');
4

3 回答 3

4

让我们分解一下:

for (i;

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

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

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

i++

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

n = 10 * n

这通过乘以 10 为 'n' 添加了一个额外的数字,因为您知道如果您的数字中还有一个字符,它必须乘以 10(假设我开始解析 100,我读取了前两个字符串,并且有10,还有一个字符,所以我乘以十得到100。

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

这会将下一个数字添加到“n”,结果是通过将当前索引处的字符减去“0”来确定的,当在 0 - 9 的范围内时,返回该数字的整数(如果这会混淆你,看看ASCII Chart

希望这有助于您理解。

于 2012-01-20T16:17:00.113 回答
3

这会将字符串表示形式转换为数字,例如“329”到 329
首先需要 3 然后 3*10+2=32
然后 32*10 + 9 =329

于 2012-01-20T16:11:48.897 回答
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) */
于 2012-01-20T16:16:16.980 回答