Стратегия для C может быть такой:
1) Поменять местами символы строки.Это приводит к тому, что слова являются правильной общей позицией, хотя и в обратном направлении.
2) Обратные символы каждого слова в строке.
Нам понадобится одна функция для обращения символов в буфере:
/*
* Reverse characters in a buffer.
*
* If provided "My name is Jack", modifies the input to become
* "kcaJ si eman yM".
*/
void reverse_chars(char * buf, int cch_len)
{
char * front = buf, *back = buf + cch_len - 1;
while (front < back)
{
char tmp = *front;
*front = *back;
*back = tmp;
front ++;
back --;
}
}
Для разбивки входного буфера на слова - функция, которая возвращает количество непробельных символов в буфере.(strtok () изменяет буфер и его сложнее использовать на месте)
int word_len(char *input)
{
char * p = input;
while (*p && !isspace(*p))
p++;
return p - input;
}
Наконец, нам понадобится функция, которая использует этих двух помощников для реализации стратегии, описанной в первом абзаце.
/*
* Reverse words in a buffer.
*
* Given the input "My name is Jack", modifies the input to become
* "Jack is name My"
*/
void reverse_words(char *input)
{
int cch_len = strlen(input);
/* Part 1: Reverse the string characters. */
reverse_chars(input, cch_len);
char * p = input;
/* Part 2: Loop over one word at a time. */
while (*p)
{
/* Skip leading spaces */
while (*p && isspace(*p))
p++;
if (*p)
{
/* Advance one complete word. */
int cch_word = word_len(p);
reverse_chars(p, cch_word);
p += cch_word;
}
}
}