Давать ошибку сегментации и IDK, где - PullRequest
0 голосов
/ 28 мая 2018

Я пишу программу на C, где пользователь вводит что-то, и если одно из слов находится в массиве (в данном случае это biblio ), но когда я собираюсь проверить это, это даетme Ошибка сегментации (ядро сброшено) .Я знаю, что эта ошибка появляется, когда программа пытается получить доступ к полю памяти, которое она не может, но я не могу найти, где она это делает и как это исправить.Кто-нибудь может мне помочь?

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

int within(char* str, char * biblio[], int size)
{
    char * aux;
    for(int i = 0; i < size; i++)
    {
        aux = biblio[i];
        if(strcmp(str, aux) == 0 )
            return 1; //return 1 --> the word exists in biblio array
    }
    return 0;
}

int main()
{
    int iterations = 5;
    int size = 50, count = 0;
    char * biblio[] = {"mostarda", "ketchup", "maionese"};
    char * input[size];
    char * str = NULL;
    int ret;
    while(iterations > 0)
    {
        do{
            printf("Enter a value: ");
            scanf("%s", str);
            ret = within(str, biblio, sizeof (biblio));
            if(ret == 1)
            {
                memset(input, 0, sizeof(input)); //clear biblio
                break;
            }
            input[count] = str;
            count++;
        }while( (strcmp(str, "EOF")) == 0);

        printf("%s", input);
        iterations--;
    }
    return 0;
}

Большое спасибо !!!

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

В общем, откомпилируйте для отладки с gcc -g, а затем запустите бинарный файл под gdb.Когда он выполняет coredumps, дайте gdb команду where, чтобы увидеть полный стек вызовов, показывая номер строки в вашей программе, где произошел сбой.

Вот, например, мой сеанс gdb, выясняющий причину.Я запускаю программу в GDB с gdb ./a.out, а затем введите тестовое значение.Когда происходит сбой, это показывает, что ошибка в (сборке) реализации strcmp (у меня нет этого исходного файла библиотеки, поэтому "Нет такого файла или каталога". Я иду up 1, чтобы переместить представление вверходин уровень в стеке (в вашу функцию within), и там я печатаю значения двух аргументов в strcmp. Один из них явно не тот, который должен быть.

Reading symbols from ./a.out...done.
(gdb) run
Starting program: /tmp/p/a.out 
Enter a value: 10

Program received signal SIGSEGV, Segmentation fault.
__strcmp_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S:31
31  ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S: No such file or directory.
(gdb) up 1
#1  0x00005555555547f4 in within (str=0x0, biblio=0x7fffffffe450, size=24) at foo.c:11
11          if(strcmp(str, aux) == 0 )
(gdb) print (str)
$1 = 0x0
(gdb) print (aux)
$2 = 0x555555554a44 "mostarda"
0 голосов
/ 28 мая 2018

Посмотрите на эти строки:

char * str = NULL;                     // str is a pointer equal NULL
int ret;
while(iterations > 0)
{
    do{
        printf("Enter a value: ");
        scanf("%s", str);              // Here you read data into str which is NULL
                                       // That will cause a program crash

Убедитесь, что str указывает на некоторую выделенную память, прежде чем вводить в нее данные.

Возможно, вы могли бы сделать:

    do{
        str = malloc(MAX_SIZE_OF_INPUT);  // Allocate memory for the string
        if (str == NULL)
        {
            // Out of memory
            exit(1);
        }
        printf("Enter a value: ");

И еще одна деталь:

}while( (strcmp(str, "EOF")) == 0);

Я думаю, вы хотите

}while( (strcmp(str, "EOF")) != 0);

Кстати: никогда не делайте:

        scanf("%s", str);

, поскольку это может переполнить любой буферна что указывает strВсегда устанавливайте ограничение на количество символов для чтения.Нравится

        scanf("%100s", str);  // Maximum is 100
...