strcmp出现分段错误(核心转储)错误

wwodge7n  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(290)

文件名为“选项”。每当我在控制台中运行这段代码时,这里我有一些可能性:
第一个月
./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 "  );
        }

    }

}
nhhxz33t

nhhxz33t1#

这段代码有几个问题。首先,你应该启用编译器警告(并且总是检查它们!)。如果你这样做了,你会看到如下所示的内容:
警告:函数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)
y53ybaqx

y53ybaqx2#

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

相关问题