为什么我在 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]
,并且由于 function
是 char *
类型,所以 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
还可以转换字符串的初始部分(如果它包含有效数字)。
我正在尝试从 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]
,并且由于 function
是 char *
类型,所以 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
还可以转换字符串的初始部分(如果它包含有效数字)。