【问题标题】:Segmentation fault (core dumped) error with strcmpstrcmp 的分段错误(核心转储)错误
【发布时间】:2019-09-23 17:44:30
【问题描述】:

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

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

    }

}

【问题讨论】:

    标签: c segmentation-fault core strcmp


    【解决方案1】:

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

    警告:函数strcmp的隐式声明

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

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

    错误:函数strcmp的参数太少

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

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

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

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

    strcmp() 只有一个参数,即(argv[i],"-c") == 0 比较的结果,其中将字符串"-c"(忽略逗号运算符的左侧)与0 进行比较,即NULL 指针。你可能想写:

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

    【讨论】:

    • 非常感谢,我知道了。
    【解决方案2】:

    您需要对代码进行几处更改:
    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
    

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 2014-08-04
      • 2012-11-19
      • 1970-01-01
      • 2015-06-25
      • 2021-06-03
      相关资源
      最近更新 更多