[C]: ошибка сегментации при использовании strcpy () в строковые массивы - PullRequest
0 голосов
/ 15 октября 2018

Мое назначение - написать функцию, которая принимает входную строку от пользователя, разбивает ее на несколько строк, каждая из которых содержит отдельное слово из входного предложения, а затем переворачивает предложение.Результатом будет ввод предложений, но со словами в обратном порядке.

Пока у меня просто есть функция, принимающая ввод, разбивая его на отдельные слова, сохраняя эти слова в массив и печатаяКаждое отдельное слово в порядке.У меня нет процесса для изменения порядка написанных слов.

Вот код функции, с которой я до сих пор справлялся:

void reverse(void){
printf("\n\n%s\n", "Reverse words in String: ");

char input[200];
printf("\n%s", "Enter string\n> ");
scanf("%s", &input);

char reverseSentence[200];
char sentenceParts[20][200];
int wordCount = 0;

char *thisWord = strtok(input, " ");
strcpy(sentenceParts[wordCount], thisWord);
wordCount++;


while(thisWord != NULL){
    thisWord  = strtok(NULL, " ");
    strcpy(sentenceParts[wordCount], thisWord);
    wordCount++;
}

printf("\n\n");

for(int i = 0; i < wordCount + 1; ++i){
    printf("%s%s", sentenceParts[i], " ");
}
}

Проблема заключается воператор while:

while(thisWord != NULL){
    thisWord  = strtok(NULL, " ");
    strcpy(sentenceParts[wordCount], thisWord);
    wordCount++;
}

Программа завершается с ошибкой сегментации в операторе strcpy.Я не могу понять на всю жизнь, почему он это делает.Кажется, что он отлично работал вне цикла while.

Есть мысли?Я застрял на этом довольно долго и не могу найти слишком много других ресурсов, чтобы помочь.

1 Ответ

0 голосов
/ 15 октября 2018

Обновление thisWord с помощью следующего токена должно происходить в конце тела цикла.Таким образом, вы в конечном итоге обновите thisWord с NULL, а затем вызовете strcpy с NULL.И это твой сегмент.

Таким образом, цикл должен выглядеть следующим образом:

char *thisWord = strtok(input, " ");
while(thisWord != NULL){
    strcpy(sentenceParts[wordCount], thisWord);
    wordCount++;
    thisWord  = strtok(NULL, " ");
}

Другая проблема (на которую указывает @ WhozCraig в комментариях) состоит в том, что вы вводите строку, используяscanf("%s", ...).Это не работает, потому что scanf остановится на первом символе пробела.Следовательно, вы получите только одно слово за один раз от scanf.Чтобы получить всю строку, используйте функцию fgets.

...