1. 程式人生 > >翻轉英文句子中單詞的順序

翻轉英文句子中單詞的順序

利用字串中的索引下標進行定位,先將整個英文句子翻轉,而後將每個英文單詞進行翻轉

/*
*程式說明:將一個英文句子翻轉,單詞中的字母順序不變
*程式思路: 先將整個句子翻轉,然後將各個單詞中的字母順序翻轉
*/

#include <iostream>
#include <string>
using namespace std;

//將從指標begin到end指標之間的字元進行反轉,其中也包括begin和end所指向的字元
void reverseWord2(char *begin,char *end){
	if(begin == NULL || end == NULL){
		return;
	}
	while(begin < end){
		char temp = *begin;
		*begin = *end;
		*end = temp;
		--end;
		++begin;
	}
}

int main(int argc, char *argv[])
{
	char s[] = "I am a student";
	reverseWord2(&s[0],&s[strlen(s) - 1]);
	
	cout<<"將整個句子翻轉過來之後的新的句子為:"<<s<<endl;

	//以空格為分割點,將字串的每個單詞進行反轉
	int i = 0,j = 0;
	while(i != strlen(s)){
		while(i != strlen(s) && isspace(s[i])){
			cout<<"i++"<<endl;
			++i;
		}
		cout<<"此時的i="<<i<<endl;
		j = i;

		while(j != strlen(s) && !isspace(s[j])){
			cout<<"j++"<<endl;
			++j;
		}

		cout<<"此時的j="<<j<<endl;
		
		cout<<"第一個單詞翻轉之前為:";
		for(int k = i;k < j;k++){
			cout<<s[k];
		}
		cout<<endl;
		//此處傳引數一定要傳入&s[j-1],記住,一定是j-1,不能是j,
		//因為reverseWord2這個函式時把從i到j之間的字母翻轉過來,包括了j,然而經過while迴圈之後j已經指向了單詞之間的空格
		reverseWord2(&s[i],&s[j-1]);

		cout<<"第一個單詞翻轉之後的結果為:";
		for(int l = i;l < j;l++){
			cout<<s[l];
		}
		cout<<endl;
		cout<<"接下來讓i在j的位置的基礎上再往前一步,跳過這個空格"<<endl;
		i = j;
	}
	
	//輸出字串
	for(int i = 0;i < strlen(s);i++){
		cout<<s[i];	
	}
	return 0;
}