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

时间:2019-09-23 17:44:30

标签: c segmentation-fault core strcmp

该文件称为“选项”。 每当我在控制台中运行此代码时,这里就有一些可能性:

./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 "  );
        }

    }

}

2 个答案:

答案 0 :(得分:2)

此代码存在多个问题。首先,您应该启用编译器警告(并始终对其进行检查!)。如果这样做,您会看到类似以下的内容:

  

警告:函数strcmp的隐式声明

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

如果您看喜欢的C文档,您会发现strcmp需要#include <string.h>。如果添加了该内容,则会收到一条有用的消息,这次是一个严重错误:

  

错误:函数strcmp的参数太少

还有一些其他有用的警告:

  

警告:逗号表达式的左操作数无效   警告:传递“ strcmp”的参数1会使指针从整数开始而无需强制转换

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

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

strcmp()只有一个参数,这是此比较(argv[i],"-c") == 0的结果,在此比较中,您将字符串"-c"(逗号运算符的左侧被忽略)与0NULL指针。您可能要写:

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

答案 1 :(得分:1)

您需要对代码进行几处更改:
1.添加string.h标头
2.重写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