我正在尝试从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
也能够转换该部分。