Внешний цикл работает всего 1 раз - C (СИ)
Формулировка задачи:
slovo1 = strtok(vspom1, " ,.&!");
while(slovo1 != 0){
per = strrev(slovo1);
puts(per);
slovo2 = strtok(vspom2, " ,.&!");
while(slovo2 != 0){
if(strcmp(per,slovo2) == 0){
puts(slovo2);
}
slovo2 = strtok(NULL, " ,.&!");
}
slovo1 = strtok(NULL, " ,.&!");
strcpy(vspom2,stroka);
}Решение задачи: «Внешний цикл работает всего 1 раз»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#define SENTENCE_DELIM ".!?"
#define WORD_DELIM ",: \t\n"
char * strrev(char * s) {
char * head, * tail, tmp;
for ( head = s, tail = s + strlen(s) - 1; head < tail; ++head, --tail ) {
tmp = *head;
*head = *tail;
*tail = tmp;
}
return s;
}
int main(void) {
char sentences[] = "Just saves the world another time. Ar you Batman? Yes, it's me!";
char * sentencePtr, * sentenceTail, * wordPtr;
for ( sentencePtr = strtok_r(sentences, SENTENCE_DELIM, &sentenceTail); sentencePtr; sentencePtr = strtok_r(NULL, SENTENCE_DELIM, &sentenceTail) ) {
for ( wordPtr = strtok(sentencePtr, WORD_DELIM); wordPtr; wordPtr = strtok(NULL, WORD_DELIM) )
printf("%s ", strrev(wordPtr));
printf("\n");
}
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем две константы SENTENCE_DELIM и WORD_DELIM для разделения предложений и слов соответственно
- Создаём функцию strrev, которая переворачивает строку
- В функции main создаём строку sentences и копируем в неё заданную последовательность символов
- Используем функцию strtok_r для разделения строки на предложения и сохраняем указатель на первое слово в переменной sentencePtr
- В цикле выводим все слова в предложении, используя функцию strtok_r для получения следующего слова и применяя функцию strrev для инвертирования порядка символов в каждом слове
- После обработки всех предложений выводим итоговый результат