Ошибка сегментации (ядро выгружено) ошибка с strcmp - PullRequest
0 голосов
/ 23 сентября 2019

Файл называется "параметры".Всякий раз, когда я запускаю этот код в консоли, здесь у меня есть несколько возможностей:

./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 ]

2 голосов
/ 23 сентября 2019

Есть несколько проблем с этим кодом.Прежде всего вы должны включить предупреждения вашего компилятора (и всегда проверять их!).Если вы это сделаете, вы увидите что-то вроде этого:

предупреждение: неявное объявление функции strcmp

, что является очень важным предупреждением: это означает, что вы забылиправильный #include и что компилятор просто угадает, в этом случае ошибочно.

Если вы посмотрите вашу любимую документацию C, вы увидите, что strcmp требует #include <string.h>.Если вы добавите это, вы получите полезное сообщение, на этот раз серьезная ошибка:

ошибка: слишком мало аргументов для работы strcmp

И парадополнительных полезных предупреждений:

предупреждение: левый операнд выражения с запятой не имеет эффекта предупреждения: передача аргумента 1 в 'strcmp' делает указатель из целого числа без приведения

Имея это в виду, внимательно изучите вызов вашей функции:

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

Существует только аргумент для strcmp(), который является результатом этого сравнения (argv[i],"-c") == 0, где вы сравниваете строку"-c" (левая часть оператора запятой игнорируется) с 0, который является NULL указателем.Вы, вероятно, хотите написать:

if (strcmp(argv[i], "-c") == 0)
1 голос
/ 23 сентября 2019

В код необходимо внести несколько изменений:
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
...