Преобразовать строку, изменив порядок следования слов в строке на обратный - C (СИ) (71348)
Формулировка задачи:
Помогите пожалуйста, преобразовать строку, изменив порядок следования слов в строке на обратный.Функциями, объявленными в string.h не пользоваться. Я тут набросал программу, но она выводит не то что надо, к примеру строка: hello world, он выведет вместо world hello - dlrow olleh. Как её доработать, чтобы она работала правильно?
#include <stdio.h> #include <locale.h.> void reverse(char str[], int n) { int c, i, j; for (i=0, j=n-1; i<j; i++, j--) { c=str[i]; str[i]=str[j]; str[j]=c; } } main () { char str[50]; int i, l=0; setlocale(LC_ALL, "Rus"); printf ("Введите строку\n"); gets (str); i=0; while (str[i] !='\0') { ++l; ++i; } reverse(str, l); printf ("Строка в обратном порядке\n"); printf ("%s",str); }
Решение задачи: «Преобразовать строку, изменив порядок следования слов в строке на обратный»
textual
Листинг программы
#include <stdio.h> #include <ctype.h> #define ch_chg(t, a, b) \ (t) = (a);\ (a) = (b);\ (b) = (t); char* rev_words(char* s){ int m, i; char* p, *e, c, *q, *t = s; e = s; while(*e) ++e; if(e > s) for(--e; (e > t) && isspace(*e); --e); while(*s && (s < e)){ while(isspace(*s)) ++s; q = s; while(*q && !isspace(*q)) ++q; m = (int)(q - s); for(i = 0; i < m; ++i){ for(p = s; p < e; ++p){ ch_chg(c, *p, *(p + 1)); } } e -= m; if(*s){ for(p = s; p < e; ++p){ ch_chg(c, *p, *(p + 1)); } --e; } } return t; } int main(void){ char s1[] = "ADA APL Algol Cobol Fortran"; char s2[] = "Кедр Сосна Ель Пихта Лиственница"; puts(s1); puts( rev_words(s1) ); putchar('\n'); puts(s2); puts( rev_words(s2) ); return 0; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы для работы со строками и преобразования символов.
- Определяется функция
rev_words
, которая будет выполнять задачу. - Внутри функции объявляются необходимые переменные:
int m, i;
- для хранения индексов и количества слов в строке;char* p, *e, c, *q, *t = s;
- для работы с указателями на символы строки.
- Инициализируется указатель
e
на последний символ строкиs
. - Переменная
s
копируется вt
, чтобы не изменять исходную строку. - Переменная
e
устанавливается на позицию после последнего символа строкиs
. - В цикле, пока есть символы в строке
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)
.
- В конце функции возвращается указатель на начало строки
t
. - В функции
main
создаются две строкиs1
иs2
для тестирования функцииrev_words
. - Выводится исходная строка
s1
. - Выводится строка
rev_words(s1)
. - Выводится символ новой строки.
- Выводится исходная строка
s2
. - Выводится строка
rev_words(s2)
. - Функция
main
возвращает 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д