對於這道題,首先要將整個字符串按照字母整個進行翻轉,然後再單詞內進行翻轉,重點在與分割出單詞來,設兩個標志first和last分別表示單詞的開始和結束位置,連續空格的第一個或單一的一個空格前一個位置是前一個單詞的結尾,連續空格的最後一個空格的下一個位置是下一個單詞的開始。
#include <iostream>
#define for if(1) for
using namespace std;
// 單詞逆序函數,用char數組傳遞
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; // 臨時字符,用於交換
// 先按字符全部換一次
for (int i=0;i!=len/2;i++)
{
temp=str[i];
str[i]=str[len-i-1];
str[len-i-1]=temp;
}
// 再按每個單詞中的字符換一次
int first(0); // 標記單詞開始下標
int last(0); // 標記單詞結束下標
for (int i=0;i!=len;i++)
{
// 碰到空格
if (' '==str[i])
{
// 連續多個空格
if (' '==str[i-1])
{
// 移動頭指針,並進行下次循環
first++;
continue;
}
// 空格前是單詞
// 標記尾為上一個
last=i-1;
// 處理單詞
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;
}
}
// 既不是空格,也沒有到尾部
else
{
NULL;
}
}
}
運行結果:
作者“菜鳥變身記”