为什么我在 c 中使用 atoi 会出现段错误?

Why do I get a segfault with atoi in c?

我正在尝试从 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])给出了段错误。为什么?

没错。我们先来看看atoi.

的签名
int atoi(const char *str);

现在,您传递给它的是 function[i],并且由于 functionchar * 类型,所以 function[i]char。而且您的角色很可能不是正确的角色指针。

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

获得它

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

但是数字比较特殊,要求有连续的代码。所以如果你知道一个字符(比如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 没有任何可靠的错误处理,这就是为什么它是 standard library functions that should never be used.

之一

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

char* endptr;
int result = strtol(str,&endptr,10);

if(endptr == str)
{
  // some conversion error
}

strtol 还可以转换字符串的初始部分(如果它包含有效数字)。