当我尝试在命令行上将数字传递到我的应用程序时,会对以下代码产生奇怪的分段错误。
int offset = 3;
int main(int argc, char *argv[]) {
// Check for arguments to see whether there is a custom offset
if (argc == 2) {
// If argc == 2 then we have a offset?
if (isdigit((unsigned char)*argv[1])) {
offset = atoi(*argv[1]);
printf("Offset changed to: %d\n", offset);
} else {
printf("Offset not changed due to %s not being a number.\n", *argv[1]);
}
} else if(argc >= 2) {
// If argc >= 2 then we have too many arguments
printf("Too many arguments.");
return 0;
}
}
答案 0 :(得分:5)
您的代码的真正的问题是您正在尝试调用未声明的函数(您必须使用C89 / 90编译器)。你打电话给isdigit
。你打电话给printf
。你打电话给atoi
。你错误地称后两者。并且编译器无法通知您有关这些函数被错误调用的唯一原因是您忘记声明它们。
在源文件的开头包含<ctype.h>
,<stdlib.h>
和<stdio.h>
,以便编译器知道atoi
和其他函数的正确参数类型。一旦这样做,您应该能够找出atoi
的问题,因为编译器将发出解释问题的诊断消息。然后您可以相应地更改呼叫。一些编译器也可以通过printf
调用来检测问题。
请注意,即使您按照其他答案(即atoi
等)的建议更改printf
和atoi(argv[1])
来电,您的代码仍然无效,因为在C89中/ 90调用printf
而不首先声明它会导致未定义的行为(在C99中,如果不首先声明它,则调用任何函数是非常不合理的。)
答案 1 :(得分:4)
argv [1]已经是一个字符串(类型为char *),因此写入* argv [1]解引用第一个字节会导致你的字段错误传递给atoi()和printf()。
将其修复为:
offset = atoi(argv[1]);
和
printf("Offset not changed due to %s not being a number.\n", argv[1]);
答案 2 :(得分:2)
问题是对atoi的调用。它需要一个字符串。将其更改为
offset = atoi(argv[1]);
答案 3 :(得分:1)
#include <ctype.h>
int isdigit(int c);
isdigit()期望检查单个字符, argv [] 是指向字符串(字符数组)的指针。 长话短说,它不会检查“1234”之类的字符串,但它会检查'1'。