Помогите перевернуть второе предложение на си

Рейтинг: 2Ответов: 1Опубликовано: 15.04.2023

Нужно поменять местами слова в предложениях например: "Мама мыла пол. Папа читал газету." на "пол мыла Мама. газету читала Папа.", с перемещением слов в одном предложении справился, с несколькими не получается

#include <stdio.h>
#include <locale.h>
#include <Windows.h>

void reverse(char* begin, char* end) {
    char temp;
    while (begin < end) {
        temp = *begin;
        *begin++ = *end;
        *end-- = temp;
    }
}



void reverseWords(char* s) {
    char* word_begin = s;
    char* temp = s;
    int x = 1;
    while (x == 1) {
        temp++;

         if (*temp == ' ') { // если пробел
            reverse(word_begin, temp - 1); // перевернуть слово до пробела 

            word_begin = temp + 1; // перейти к следующему слову 
        }
         else if (*temp == '.') { // если конец строки
            reverse(word_begin, temp-1); // перевернуть последнее слово
            temp+=4;
            reverse(s, temp-5); // перевернуть всю строку
            temp-=2;
            puts(temp);
            x = 0;
        }


    }


}


int main() {
    //system("chcp 65001"); 
    setlocale(LC_ALL, "rus");
    SetConsoleCP(1251); // включить кодировку Win1251 при вводе с консоли 
    SetConsoleOutputCP(1251); // включить кодировку Win1251 при выводе на консоли 
    char s[] = "Мама мыла пол. Папа читал газету.";

    reverseWords(s); // перевернуть слова в предложении


    //printf("%s\n", s); // напечатать результат 
    puts(s);

    return 0;
}

Ответы

▲ 2

Вот решение.

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <locale.h>

void reverse(char* begin, char* end) {
    char temp;
    while (begin < end) {
        temp = *begin;
        *begin++ = *end;
        *end-- = temp;
    }
}

void reverseWords(char* s) {
    char* word_begin = s;
    char* temp = s;
    int x = 1;
    while (x == 1) {
        temp++;

        if (*temp == ' ') { // если пробел
            reverse(word_begin, temp - 1); // перевернуть слово до пробела

            word_begin = temp + 1; // перейти к следующему слову
        }
        else if (*temp == '\0') { // если конец строки
            reverse(word_begin, temp-1); // перевернуть последнее слово
            reverse(s, temp-1); // перевернуть всю строку
            x = 0;
        }


    }

}


// Функция, которая разбивает текст на предложения по точке
void split_by_dot(char *text) {
    // Инициализируем указатель на начало предложения
    char *sentence = text;
    // Ищем точку в тексте
    char *dot = strchr(text, '.');
    // Пока есть точка в тексте
    while (dot != NULL) {
        // Заменяем точку на нулевой символ для завершения строки
        *dot = '\0';
        // Выводим предложение на экран
        reverseWords(sentence);
        printf("%s. ",sentence);
        // Перемещаем указатель на начало следующего предложения
        sentence = dot + 1;
        // Ищем следующую точку в тексте
        dot = strchr(sentence, '.');
    }
    // Выводим последнее предложение на экран, если оно не пустое
    if (*sentence != '\0') {

        printf("%s.", sentence);
    }
}

// Пример использования функции
int main() {
    setlocale(LC_ALL, "rus");
    SetConsoleCP(1251); // включить кодировку Win1251 при вводе с консоли
    SetConsoleOutputCP(1251); // включить кодировку Win1251 при выводе на консоли
    // Объявляем и инициализируем текст
    char text[] = "Мама мыла пол.Папа читал газету.";
    // Вызываем функцию для разбиения текста на предложения по точке
    split_by_dot(text);
    // Возвращаем нулевой код завершения программы
    return 0;
}