Внешний цикл работает всего 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 раз, хотя слово в строке не одно. После прохождения внутреннего цикла slovo1 становится равно '0' и внешний цикл завершается, а мне нужно пройти цикл столько раз, сколько слов в строке.

Решение задачи: «Внешний цикл работает всего 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Определяем две константы SENTENCE_DELIM и WORD_DELIM для разделения предложений и слов соответственно
  3. Создаём функцию strrev, которая переворачивает строку
  4. В функции main создаём строку sentences и копируем в неё заданную последовательность символов
  5. Используем функцию strtok_r для разделения строки на предложения и сохраняем указатель на первое слово в переменной sentencePtr
  6. В цикле выводим все слова в предложении, используя функцию strtok_r для получения следующего слова и применяя функцию strrev для инвертирования порядка символов в каждом слове
  7. После обработки всех предложений выводим итоговый результат

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.455 из 5
Похожие ответы