strcmp 的分段错误(核心转储)错误

Segmentation fault (core dumped) error with strcmp

文件名为 "options"。 每当我在控制台中 运行 这段代码时,这里我有一些可能性:

./options -c
./options -c -E

我收到 消息:"Segmentation fault (core dumped)" 真的不知道该怎么做,我可能需要一些帮助。

#include <stdio.h>

int main(int argc, char *argv[]){    
    int i;
    for(i = 0; i < argc; i++){
        if(strcmp((argv[i],"-c") == 0)){
            printf("Argumento %d es %s\n", i, "Compilar");
        }
        else if(strcmp((argv[i],"-E") == 0)){
            printf("Argumento %d es %s\n", i, "Preprocesar");
        }  
        else if(strcmp((argv[i],"-i") == 0)){
            printf("Argumento %d es %s\n", i, "Incluir "  );
        }

    }

}

您需要对代码进行几处更改:
1. 添加 string.h header
2. re-write strcmp 行:现在是 - strcmp((argv[i],"-c") == 0)

经过上述更改:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]){
    int i;
    for(i = 0; i < argc; i++){
        if(strcmp(argv[i],"-c") == 0){
            printf("Argumento %d es %s\n", i, "Compilar");
        }
        else if(strcmp(argv[i],"-E") == 0){
            printf("Argumento %d es %s\n", i, "Preprocesar");
        }
        else if(strcmp(argv[i],"-i") == 0){
            printf("Argumento %d es %s\n", i, "Incluir "  );
        }

    }

}

输出:

$ ./a.out -E
Argumento 1 es Preprocesar

这段代码有几个问题。首先,您应该启用编译器警告(并始终检查它们!)。如果这样做,您会看到类似这样的内容:

warning: implicit declaration of function strcmp

这是一个非常重要的警告:这意味着您忘记了正确的 #include 并且编译器只会猜测,在这种情况下是错误的。

如果您查看自己喜欢的 C 文档,您会发现 strcmp 需要 #include <string.h>。如果你添加它,你会得到一条有用的消息,这次是一个硬错误:

error: too few arguments to function strcmp

还有一些额外的有用警告:

warning: left-hand operand of comma expression has no effect warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast

考虑到这一点,仔细检查您的函数调用:

if(strcmp((argv[i],"-c") == 0))

strcmp()只有一个参数,就是这个比较(argv[i],"-c") == 0的结果,你比较一个字符串"-c"(逗号运算符左边被忽略) 0 是一个 NULL 指针。你可能想写:

if (strcmp(argv[i], "-c") == 0)