题目:输入一英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,为简单起见标点符号和普通字母一样处理。例如输入字符"I am
a student." 则输出"student. a am I"。
第一步:翻转真个句子中所有的字符
第二步:逐个翻转每个单词中字符的顺序。
翻转任意一段字符串的代码如下:
void Reverse(char* begin,char* end) { while(begin<end) { char temp = *begin; *begin = *end; *end = temp; //直接交换的是字符串中的内容 begin++; end--; } //注意交换的这里 }
在英语中,单词被空格所分隔,因此我们可以通过扫描空格来确定每个单词的起始和终止位置,在翻转的每个阶段,begin始终指向单词的第一字符,而end始终指向最后一个字符。
完整代码如下:
#include<iostream> using namespace std; void Reverse(char* begin,char* end); char* Stence(char* pstring); int main() { char array[20]={'I',' ','a','m',' ','a','s',' ','s'}; char* point=array; while(*point!='\0') cout<<*(point++); cout<<endl; point=Stence(array); while(*point!='\0') cout<<*(point++); return 0; } void Reverse(char* begin,char* end) { while(begin<end) { char temp = *begin; *begin = *end; *end = temp; //直接交换的是字符串中的内容 begin++; end--; } //注意交换的这里 } char* Stence(char* pstring) { if(pstring==NULL) return NULL; char* pbegin=pstring; char* pend= pstring; while(*pend!='\0') pend++; pend--; Reverse(pbegin,pend);//翻转整个句子 pbegin=pend=pstring; while(*pbegin!='\0') //逐个翻转单词 { if(*pbegin==' ') { pend++; pbegin++; } else if(*pend==' '||*pend=='\0') { Reverse(pbegin,--pend); pbegin=++pend; } else pend++; } return pstring; }