7

我是一名 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,那么函数的其余部分如何工作?我可能把我的基础知识都搞砸了,但任何帮助都将不胜感激。谢谢,-克雷格

4

6 回答 6

11
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。

于 2011-10-31T17:58:23.663 回答
4

第一个循环执行注释所说的:它跳过空格。

在它之后,i是第一个非空白字符的索引,这正是您需要进行的。

于 2011-10-31T17:53:24.107 回答
1

不,第一个循环跳过空格,就像评论说的那样。

于 2011-10-31T17:53:32.723 回答
1

评论提供了答案:第一个循环是跳过空白。因为2992i会留下0

于 2011-10-31T17:53:43.627 回答
1

第一个 for 循环推进 i 指向第一个非空白字符。

循环之间的条件会记下符号(如果有)。

然后最后的 for 循环进行实际转换。

最后,应用符号,并返回结果。

于 2011-10-31T17:54:00.850 回答
0

1)没有第一个for循环不计算字符数,但如果只有起始字符是空格,它会计算数字的第一个位置,即对于这个“-2992”我将是1,对于“2992”我将是0。2)sign = (s[i++] == '+') ? 1 : -1;此语句检查第 i 个字符是否为符号并使计数器升高 1[i++],对于下一个 for 循环,此 i 是字符串中的第一个起始数字。如果我为 0,那么对于第一个条件输入,您的检查章程将是空格!

edit1:第一个输入是“space space-2992”

于 2013-09-26T16:06:35.250 回答