C在while条件内的函数内递增变量

时间:2016-01-21 16:41:54

标签: c pointers

我实现了atoi功能。条件的第一个给出了错误的答案,而条件的第二个给出了正确的答案(假设我在while块中增加了指针)

while( isdigit(*(str++)) )
while( isdigit(*str) )

为什么?

当条件评估'str'然后递增时,不应该是第一个。然后取消引用评估的地址。然后将它传递给isdigit?!

是否与条件中的第二个相同(只要它在循环内递增)?

以下是完整代码,以防万一:

int atoi(char *str)
{
    int sign, number = 0;

    while( isspace(*str) )
        ++str;

    sign = (*str == '-') ? -1 : 1;

    if(*str == '-' || *str == '+')
        str++;

    //while( isdigit(*(str++)) )
    while( isdigit(*str) )
    {
        number = 10 * number + (*str - '0');
        str++;
    }
    return sign * number;
}

2 个答案:

答案 0 :(得分:3)

错误剖析:isdigit(*str++)告诉您str指向的字符是否为数字,因此您决定迭代循环来处理字符 - 但++推进在进入循环体之前指针,因此您处理 next 字符。

此外,正如@iharob在下面的评论中指出的那样,尽管str结果,isdigit也会增加,当字符不是数字时也是如此。因此,下面的代码(如果有的话)不会处理第一个非数字字符。

while(isspace(...))潜在相同的问题。

答案 1 :(得分:2)

问题不在于while (isdigit(*str++)),而是在这一行

number = 10 * number + (*str - '0');

str指向下一个字符,因为您已在str条件中增加while

这就是为什么你不能在while条件下递增指针的原因。但是,您可以在分配中执行此操作,从而导致以下循环

while (isdigit((unsigned char) *str) != 0)
    number = 10 * number + (*str++ - '0');

这是可能实施的一个例子

#include <ctype.h>

int my_atoi(const char *str)
{
    int sign;
    int number;

    number = 0;

    while (isspace((unsigned char) *str) != 0)
        ++str;

    sign = 1;
    switch (*str)
    {
        case '-':
            sign = -1;
        case '+':
            str++;
            break;
    }

    while (isdigit((unsigned char) *str) != 0)
        number = 10 * number + (*str++ - '0');

    return sign * number;
}