Было бы проще читать, понимать и отлаживать ваш код, если бы он был проще.Обратите внимание, что вы повторяете код, чтобы изменить последовательность символов в двух разных местах - вы должны использовать подпрограмму.Более простой, интуитивно понятный и быстрый алгоритм, чем тот, который вы используете:
/* reverse s[first ... last] in place */
void reverse(char* s, int first, int last){
for( ; first < last; first++, last-- ){
char c = s[first];
s[first] = s[last];
s[last] = c;
}
}
Тогда ваша программа сводится к чему-то простому:
void reverse_reverse(char* s) {
int len = strlen(s);
reverse(s, 0, len - 1);
for( int word = 0, i = 0;; i++ ){
if( i == len || s[i] == ' ' ){
reverse(s, word, i-1);
if( i == len ) break;
word = i + 1;
}
}
}
Обратите внимание, что я перенес конец теставнутри цикла for для обработки последнего слова в строке, если за ним не стоит пробел.