關鍵在於正確分割單詞:用 first/last 標記單詞起止位置。連續空格的第一個(或單一空格)前一位置為前一單詞結尾;連續空格最後一個空格的下一位置為下一單詞開頭。
#include
#define for if(1) for
using namespace std;
void WordDesc(char str[]);
void main() {
char str[] = "I am a student";
cout << "處理前:" << str << endl;
WordDesc(str);
cout << "處理後:" << str << endl;
}
void WordDesc(char str[]) {
int len = strlen(str);
char temp;
// 步驟 1:整體字元反轉
for (int i = 0; i != len/2; i++) {
temp = str[i];
str[i] = str[len-i-1];
str[len-i-1] = temp;
}
// 步驟 2:逐單詞反轉
int first = 0, last = 0;
for (int i = 0; i != len; i++) {
if (' ' == str[i]) { // 遇到空格
if (' ' == str[i-1]) { // 連續空格
first++; continue; // 移動頭指標
}
last = i-1; // 標記單詞結尾
// 反轉單詞 [first, last]
for (int j = first; j != last - (last-first)/2; j++) {
temp = str[j];
str[j] = str[last-j+first];
str[last-j+first] = temp;
}
first = i+1; // 下一單詞開頭
}
else if (i == len-1) { // 非空格且到尾部
last = i;
for (int j = first; j != last - (last-first)/2; j++) {
temp = str[j];
str[j] = str[last-j+first];
str[last-j+first] = temp;
}
}
}
}

—— 作者:菜鳥變身記