对于这道题,首先要将整个字符串按照字母整个进行翻转,然后再单词内进行翻转,重点在与分割出单词来,设两个标志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;
- }
- }
- }
另外简单一点的思路:
- #include<iostream>
- using namespace std;
- void invert(char str[]) //要用字符数组不要用字符指针
- {
- int length=strlen(str);
- int first;
- int last;
- for(int i=0;i<length/2;i++)
- {
- char tmp=str[i];
- str[i]=str[length-1-i];
- str[length-1-i]=tmp;
- }
- cout<<str<<endl;
- i=0;
- while(str[i]!='\0')
- {
- if(str[i]!=' ')
- {
- first=i;
- while(str[i]!='\0'&&str[i]!=' ')
- {i++;}
- last=i-1;
- while(last>first)
- {
- char tmp=str[first];
- str[first]=str[last];
- str[last]=tmp;
- last--;
- first++;
- }
- }
- else
- i++;
- }
- }
- void main()
- {
- char a[]="i come from tianjin.";//要用字符数组 不要用字符指针 内存错误
- invert(a);
- cout<<a<<endl;
- }
运行结果: