#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');
答案 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) */