我是一名python程序员,从K& R书中学习C语言。这似乎是一个非常微不足道的问题,但我仍然难过。 下面附有K& R(RIP Ritchie!)一书的代码片段,它实现了atoi()函数。
atoi(s) /*convert s to integer */
char s[];
{
int i, n, sign;
for (i=0; s[i]==' '||s[i] == '\n' || s[i] == '\t'; i++)
; /* skip whitespace */
sign = 1;
if (s[i] == '+' || s[i] = '-') /* sign */
sign = (s[i++] == '+') ? 1 : -1;
for (n=0; s[i] >= '0' && s[i] <= '9'; i++)
n = 10 * n + s[i] - '0';
return (sign * n);
}
我的问题:
1)除了计算有效字符的数量之外,第一个'for'循环是否可用于任何目的?
2)如果(1)为真,则第一个循环将'i'的值设置为有效字符的数量 - 第二个for循环如何工作而不将i重置为0?
比如说我输入'2992'作为函数的输入。第一个for循环将i设置为3,那么函数的其余部分如何工作? 我的基础知识可能搞得一团糟,但任何帮助都会非常感激。谢谢,-Craig
答案 0 :(得分:10)
int atoi(char* str)
{
if(!str)
printf("Enter valid string");
int number = 0;
char* p = str;
while((*p >= '0') && (*p <= '9'))
{
number = number * 10 + (*p - '0');
p++;
}
return number;
}
这是ATOI背后的整个想法。
1)将指针设置在char数组的开头
2)然后在while循环中,你遍历每个字符并乘以10并通过减去0来添加字符。
如果您尝试2992,那么这个数字也是2992。
答案 1 :(得分:4)
第一个循环执行注释所说的内容:它跳过空格。
之后,i
是第一个非空白字符的索引,这正是您需要继续的。
答案 2 :(得分:1)
不,第一个循环会跳过空白,就像评论所说的那样。
答案 3 :(得分:1)
评论提供了答案:第一个循环是跳过空白。对于2992
,i
将保持0
。
答案 4 :(得分:1)
第一个for循环使i指向第一个非空白字符。
循环之间的条件记录了符号(如果有的话)。
然后最后的for循环进行实际转换。
最后,应用符号,并返回结果。
答案 5 :(得分:0)
1)没有第一个for循环不计算字符数,但如果只有起始字符是空格,则它计算数字的第一个位置,即对于这个“-2992”我将为1而对于“2992”我将为0 。
2)sign = (s[i++] == '+') ? 1 : -1;
此语句检查第i个字符是否为符号并使计数器加1 [i ++]并且对于下一个for循环,此i是字符串中的第一个起始数字。如果我为0,那么对于第一次有条件的输入你的检查章程就是空格!
edit1:第一个输入是“space space-2992”