c - isdigit() 段错误

标签 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;
    }
}

最佳答案

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

包括<ctype.h> , <stdlib.h><stdio.h>在源文件的开头,以便编译器知道 atoi 的正确参数类型和其他功能。一旦你这样做了,你应该能够找出 atoi 的问题。 ,因为编译器会发出解释问题的诊断消息。然后您可以相应地更改调用。一些编译器将能够检测到 printf 的问题。也打电话。

请注意,即使您更改了 atoiprintf按照其他答案中的建议调用(即 atoi(argv[1]) 等),您的代码仍然无效,因为在 C89/90 中调用 printf不先声明它会导致未定义的行为(在 C99 中,调用任何函数而不先声明它是完全非法的)。

关于c - isdigit() 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3950846/

相关文章:

c - 从函数返回结构体的动态数组

c - c 中的 switch case 语句没有给出结果

php - 将太少的参数传递给函数时,PHP 7 是否会引发错误?

c - For 循环中的段错误

c - Sprintf 段错误

c++ - 循环保存openGL中的顶点

使用 msi API 更改安装路径

java - 在运行方法之前检查参数的最佳方法

Python 参数作为字典

c - 如果我不说 int i=0 就会出现段错误