我实现了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;
}
答案 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;
}