为什么我在c中得到atoi的segfault



我正在尝试从argv中读取一个字符串。它应该是像"-x^2-5"等这样的数学函数

我有这样的东西:

void test(char *function){
int temp = 0;
for (int i = 0; i < strlen(function); i++){
if((function[i] != '+') && (function[i] != ...){
// function[i] is a digit, but still as a char
temp = atoi(function[i]);
}
}
//... 
}
int main(int argc, char **argv){
test(argv[1]);
//...
}

直到循环的最后一圈,这项工作都很好。如果我使用printf("%c", function[i]);,它说,它是5

atoi(function[i])给出了一个segfault。为什么?

右侧。让我们先来看看atoi的签名。

int atoi(const char *str);

现在,传递给它的是function[i],并且由于function的类型是char *,所以function[i]char。你的角色很可能不是一个合适的角色指针。

您想要传递给atoi的是一个const char *,您可以通过调用atoi(&function[i]);来获得它

正如@sham1所说,atoi期望其参数为C字符串,这是一个以null结尾的char数组,而您只有一个char。

但是数字是特殊的,因为它们需要有连续的代码。所以,如果你知道一个字符(比如c(是一个数字,那么它的值就是c - '0'。所以你可以写:

if((function[i] != '+') && (function[i] != ...){
// function[i] is a digit, but still as a char
temp = function[i] - '0';    // get the int value of a digit character
}

除了其他答案中指出的错误之外,atoi没有任何可靠的错误处理,这就是为什么它是永远不应该使用的标准库函数之一。

忘记你曾经听说过atoi,并将其替换为:

char* endptr;
int result = strtol(str,&endptr,10);
if(endptr == str)
{
// some conversion error
}

如果字符串的初始部分包含有效数字,strtol也能够转换该部分。

相关内容

  • 没有找到相关文章

最新更新