#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
буфера.