当前位置:编程学习 > C/C++ >>

按照单词翻转字符串,不改变单词内字母之间的顺序

对于这道题,首先要将整个字符串按照字母整个进行翻转,然后再单词内进行翻转,重点在与分割出单词来,设两个标志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;  
        }  
    }  

运行结果:

作者“菜鸟变身记”

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,