Как доработать программу?

Вводится строка, нужно перевернуть второе и последнее слово, за последним словом точка.
Так же словом можно считать только кириллицу и латиницу, остальное - разделители.
Данная программа работает так:
Ввод: У?меняесть_-ANANAS
Вывод: У янем есть SANANA.
А нужно, чтобы она не убирала разделители, то есть
Вывод: У?янем
есть_-SANANA.
Что сделать, чтобы программа выполнялась как нужно?

 void func(char s[1000]) {
        char* p = 0; // нужен нулевой указатель для strtok
        char copy[100]; //задали буфер для строки результата
        char* c = strtok_s(s, "1234567890!@#$%^&*()_=+/?№;:?*`~{}[]<> ,.-", &p); //функция strtok умеет делать разбор на слова
        char* pred; //указатель на предыдущее слово, найденное strtok
        memset(copy, '\0', 100); //буфер заполнили нулями
        printf("Rezultat: ");
        int i = 1;
        while (c != NULL) { //пока еще есть слова
            i++;            //счетчик слов 
            pred = c;   //запоминаем пред. слово
            c = strtok_s(NULL, "1234567890!@#$%^&*()_=+/?№;:?*`~{}[]<> ,.-", &p); // следующее слово 
            if (i == 2) { //переворот 1 слова
                _strrev(c);
            }
            if (c == NULL) { //и 2 слова
                _strrev(pred);
            }
            strcat_s(copy, pred);       //переписываем слово в буфер
            strcat_s(copy, " ");        //и добавляем после него пробел
        }
        copy[strlen(copy) - 1] = '.';   //точка в конце предложения
        puts(copy);
    }
    
    void main() {
        printf("Vvedite stroku: ");//ввод
        char s[1000];
        gets_s(s);
        func(s); //вывод
    }

Ответы (1 шт):

Автор решения: DmitryK

Конкретно в вашей программе, вы сами копируете слово в новый буфер, а потом добавляете пробел - поэтому и удаляются разделители.

strcat_s(copy, pred);       //переписываем слово в буфер
strcat_s(copy, " ");        //и добавляем после него пробел

Вообще-то здесь ничего никуда копировать не надо - можно работать прямо с оригинальной строкой.

  • находите начало второго слова (указатель).
  • находите конец второго слова.
  • циклом делаете реверс слова.
  • идете в конец строки. Аналогично находите начало и конец последнего слова.
  • делаете реверс слова

Только продумайте что делать, если предложение состоит например из 1 или 2 слов.

→ Ссылка