isdigit()分段错误

Ara*_*ran 0 c arguments segmentation-fault

当我尝试在命令行上将数字传递到我的应用程序时,在以下代码上获得奇怪的分段错误.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 5

您的代码的真正问题在于您正在尝试调用未声明的函数(您必须使用C89/90编译器).你打电话isdigit.你打电话printf.你打电话atoi.你错误地称后两者.并且编译器无法通知您有关这些函数被错误调用的唯一原因是您忘记声明它们.

包括<ctype.h>,<stdlib.h>并且<stdio.h>在你的源文件的开头,让编译器知道正确的参数类型atoi等功能.一旦你这样做,你应该能够找出问题atoi,因为编译器会发出解释问题的诊断消息.然后您可以相应地更改呼叫.一些编译器也能够通过printf调用来检测问题.

请注意,即使您按照其他答案(即等)中的建议更改atoiprintf调用atoi(argv[1]),您的代码仍将保持无效,因为在C89/90调用中printf没有声明它会导致未定义的行为(并且在C99中它是平的-out非法调用任何函数而不先声明它.