C递增函数中的变量,该函数为';它在while条件中

C递增函数中的变量,该函数为';它在while条件中,c,pointers,C,Pointers,我已经实现了atoi函数。第一个while-conditional给出错误答案,而第二个while-conditional给出正确答案(前提是我在while块中增加指针) 为什么呢 第一个while条件不应该计算'str',然后递增。然后取消对已计算地址的引用。然后把它传给isdigit 这不是和第二个while条件相同吗(只要它在循环中递增) 以下是完整的代码,以防万一: int atoi(char *str) { int sign, number = 0; while( i

我已经实现了atoi函数。第一个while-conditional给出错误答案,而第二个while-conditional给出正确答案(前提是我在while块中增加指针)

为什么呢

第一个while条件不应该计算'str',然后递增。然后取消对已计算地址的引用。然后把它传给isdigit

这不是和第二个while条件相同吗(只要它在循环中递增)

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

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;
}

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

number = 10 * number + (*str - '0');
str
指向下一个字符,因为您已经在
while
条件中增加了
str

这就是为什么在
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;
}
#包括
int my_atoi(常量字符*str)
{
整数符号;
整数;
数字=0;
while(isspace((无符号字符)*str)!=0)
++str;
符号=1;
开关(*str)
{
案例'-':
符号=-1;
格“+”:
str++;
打破
}
while(isdigit((无符号字符)*str)!=0)
数字=10*number+(*str++-'0');
返回标志*编号;
}

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

number = 10 * number + (*str - '0');
str
指向下一个字符,因为您已经在
while
条件中增加了
str

这就是为什么在
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;
}
#包括
int my_atoi(常量字符*str)
{
整数符号;
整数;
数字=0;
while(isspace((无符号字符)*str)!=0)
++str;
符号=1;
开关(*str)
{
案例'-':
符号=-1;
格“+”:
str++;
打破
}
while(isdigit((无符号字符)*str)!=0)
数字=10*number+(*str++-'0');
返回标志*编号;
}

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

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


while(isspace(…)
错误剖析可能存在相同的问题:
isdigit(*str++)
告诉您str
指向的字符是否是数字,因此您决定迭代循环以处理该字符-但是
++
在进入循环体之前推进指针,所以你要处理下一个角色

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


while(isspace(…)

可能存在同样的问题,我刚刚意识到
isspace(0)
将返回
0
以及
isdigit(0)
。。。我在想什么?我真的很好奇…我刚刚意识到
isspace(0)
将返回
0
,以及
isdigit(0)
。。。我在想什么?我真的很想知道…我很抱歉,刚刚意识到为什么你说你是100%正确的。如果
isspace()。“失败”意味着函数对输入字符的分类不正确。我很抱歉,刚刚意识到为什么你说你可能100%正确。如果
isspace()。“fail”表示函数对输入字符的分类不正确。