Ошибка сегментации в strtok

#c #segmentation-fault

#c #ошибка сегментации

Вопрос:

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

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

char * VOWELS ="aeiouAEIOU";


void printLatinWord(char *a);


int main(int argc, char **argv){
    char phrase[100];
    char *word = malloc(sizeof(char) *100);

    printf("Enter the phrase to be translated: n");

    fgets(word, 100, stdin);
    printf("The phrase in Pig Latin is:n");
    word = strtok(phrase, " ");
    printLatinWord(word);

    return 0;
}

void printLatinWord(char *word){
    while (strchr(VOWELS, *word) == NULL){
    char consonant = *word;
    char *to=word, *from=word 1;

    while (*from)
         *to  =*from  ;
         *to=consonant;
    }
    printf("%sayn", word);
}
  

вывод выдает «Ошибка сегментации (сброс ядра)».

Комментарии:

1. Хотя это не ответ, вам действительно следует научиться использовать gdb , поскольку это позволит вам точно увидеть, где возникает проблема.

2. Как далеко он заходит, прежде чем возникают ошибки сегментации? Выполняются ли другие printf инструкции? Возможно, потребуется использовать отладчик для пошагового выполнения.

3. Это выглядит немного ложным: char *word = malloc(sizeof(char) *100); . Затем вы переназначаете word с возвращаемым значением strtok() .

Ответ №1:

 fgets(word, 100, stdin);
word = strtok(phrase, " ");
  

Здесь у вас неверные параметры. Вы разбиваете строку на phrase неинициализированную, а затем присваиваете результат word таким образом, перезаписывая указатель на ранее выделенную вами память.

Вероятно, вы хотели, чтобы fgets ввод считывался в phrase , а не word .

Комментарии:

1. Обратите внимание, что вам не нужно выделять память для word . После вызова strtok он будет указывать на данные внутри phrase буфера.