Преобразовать строку, изменив порядок следования слов в строке на обратный - C (СИ) (71258)
Формулировка задачи:
Помогите пожалуйста решить такую задачу: Преобразовать строку, изменив порядок следования слов в строке на обратный, накидал код на паскале, теперь не знаю как на Си реализовать подобное.
function convert(const s: string): string;
var
i, j, k: integer;
res: string;
begin
i := length(s);
res := '';
while (i > 0) do
begin
j := i;
while (i > 0) and (s[i] <> ' ') do dec(i);
for k := i + 1 to j do
res := res + s[k];
res := res + ' ';
dec(i);
end;
convert := res;
end;
var
s: string;
begin
readln(s);
writeln(convert(s));
end.Решение задачи: «Преобразовать строку, изменив порядок следования слов в строке на обратный»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
void rev_cat(char * in, char * out, const char * delim) {
if ( in = strtok(in, delim) ) {
rev_cat(NULL, out, delim);
strcat(out, in);
strcat(out, " ");
}
}
char * words_reverse(char * str, const char * delim) {
char tmp[strlen(str) + 2];
*tmp = '\0';
rev_cat(str, tmp, delim);
tmp[sizeof(tmp) - 2] = '\0';
return strcpy(str, tmp);
}
#define DELIM " \t\n"
int main(void) {
char buf[BUFSIZ];
while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
printf("Result: %s\n", words_reverse(buf, DELIM));
return 0;
}
Объяснение кода листинга программы
В этом коде представлен алгоритм обратного разделения строки (reverse string split). Список действий:
- В функции main():
- Запрашивается исходная строка с помощью функции
fgets(). - Используется функция
words_reverse()для обращения порядка слов в строке. - Результат выводится на экран с помощью
printf().
- Запрашивается исходная строка с помощью функции
- В функции words_reverse():
- Создается буфер
tmpдля хранения результата. - Строка
delimинициализируется символом новой строки ('\n'). - Строка
strкопируется в буферtmp. - В цикле рекурсивно вызывается функция
rev_cat(), пока не будет получена следующая строка, разделенная символомdelim. - Результат добавляется в буфер
tmp. - Добавляется символ новой строки ('\n').
- Строка
strочищается и заполняется содержимым буфераtmp. - Строка
strвозвращается.
- Создается буфер
- В функции rev_cat():
- Если входная строка не равна
NULL, то вызывается функцияstrtok()для разделения строки на слова и возврата первого слова. - Если первое слово не равно
NULL, то функцияrev_cat()вызывается рекурсивно для обработки следующего слова. - В строку
outдобавляется текущее слово, разделенное пробелом. - Если входная строка равна
NULL, то возвращаетсяNULL. Таким образом, этот код преобразует строку, изменяя порядок следования слов в строке на обратный.
- Если входная строка не равна