Преобразовать строку, изменив порядок следования слов в строке на обратный - C (СИ) (71348)

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста, преобразовать строку, изменив порядок следования слов в строке на обратный.Функциями, объявленными в string.h не пользоваться. Я тут набросал программу, но она выводит не то что надо, к примеру строка: hello world, он выведет вместо world hello - dlrow olleh. Как её доработать, чтобы она работала правильно?
Листинг программы
  1. #include <stdio.h>
  2. #include <locale.h.>
  3. void reverse(char str[], int n)
  4. {
  5. int c, i, j;
  6. for (i=0, j=n-1; i<j; i++, j--) {
  7. c=str[i];
  8. str[i]=str[j];
  9. str[j]=c;
  10. }
  11. }
  12. main ()
  13. {
  14. char str[50];
  15. int i, l=0;
  16. setlocale(LC_ALL, "Rus");
  17. printf ("Введите строку\n");
  18. gets (str);
  19. i=0;
  20. while (str[i] !='\0') {
  21. ++l;
  22. ++i;
  23. }
  24. reverse(str, l);
  25. printf ("Строка в обратном порядке\n");
  26. printf ("%s",str);
  27. }

Решение задачи: «Преобразовать строку, изменив порядок следования слов в строке на обратный»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #define ch_chg(t, a, b) \
  4. (t) = (a);\
  5. (a) = (b);\
  6. (b) = (t);
  7.  
  8. char* rev_words(char* s){
  9.     int   m, i;
  10.     char* p, *e, c, *q, *t = s;
  11.  
  12.     e = s;
  13.     while(*e)
  14.         ++e;
  15.     if(e > s)
  16.         for(--e; (e > t) && isspace(*e); --e);
  17.  
  18.  
  19.     while(*s && (s < e)){
  20.         while(isspace(*s))
  21.             ++s;
  22.  
  23.         q = s;
  24.         while(*q && !isspace(*q))
  25.             ++q;
  26.  
  27.         m = (int)(q - s);
  28.         for(i = 0; i < m; ++i){
  29.             for(p = s; p < e; ++p){
  30.                 ch_chg(c, *p, *(p + 1));
  31.             }
  32.         }
  33.  
  34.         e -= m;
  35.         if(*s){
  36.             for(p = s; p < e; ++p){
  37.                 ch_chg(c, *p, *(p + 1));
  38.             }
  39.             --e;
  40.         }
  41.     }
  42.     return t;
  43. }
  44.  
  45.  
  46. int main(void){
  47.     char s1[] = "ADA APL Algol Cobol Fortran";
  48.     char s2[] = "Кедр Сосна Ель Пихта Лиственница";
  49.  
  50.     puts(s1);
  51.     puts( rev_words(s1) );
  52.     putchar('\n');
  53.  
  54.     puts(s2);
  55.     puts( rev_words(s2) );
  56.     return 0;
  57. }

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

  1. Включаются необходимые заголовочные файлы для работы со строками и преобразования символов.
  2. Определяется функция rev_words, которая будет выполнять задачу.
  3. Внутри функции объявляются необходимые переменные:
    • int m, i; - для хранения индексов и количества слов в строке;
    • char* p, *e, c, *q, *t = s; - для работы с указателями на символы строки.
  4. Инициализируется указатель e на последний символ строки s.
  5. Переменная s копируется в t, чтобы не изменять исходную строку.
  6. Переменная e устанавливается на позицию после последнего символа строки s.
  7. В цикле, пока есть символы в строке s, происходит следующее:
    • Пропускаются пробелы в начале слова.
    • Сохраняется текущий символ c и его следующий символ (p = s; p < e; ++p) для дальнейшей обработки.
    • Устанавливается переменная q на позицию начала слова, а p на позицию после последнего символа слова.
    • Вычисляется длина слова m и сохраняется в переменной i.
    • В цикле i раз, начиная с первого символа после пробела, происходит обмен символов c и (p + 1).
    • Указатель e сдвигается на m символов назад.
    • Если текущий символ s не является пробелом, то происходит обмен символов c и (p + 1).
    • Если текущий символ s является последним символом слова, то происходит обмен символов c и (p + 1).
  8. В конце функции возвращается указатель на начало строки t.
  9. В функции main создаются две строки s1 и s2 для тестирования функции rev_words.
  10. Выводится исходная строка s1.
  11. Выводится строка rev_words(s1).
  12. Выводится символ новой строки.
  13. Выводится исходная строка s2.
  14. Выводится строка rev_words(s2).
  15. Функция main возвращает 0, что означает успешное выполнение программы.

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


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

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

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы