C递增函数中的变量,该函数为';它在while条件中
我已经实现了atoi函数。第一个while-conditional给出错误答案,而第二个while-conditional给出正确答案(前提是我在while块中增加指针) 为什么呢 第一个while条件不应该计算'str',然后递增。然后取消对已计算地址的引用。然后把它传给isdigit 这不是和第二个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
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”表示函数对输入字符的分类不正确。