将一句话里的单词进行倒置,标点符号不倒换。

比如 一句话“i love you.”转换后为:“you. love i”。

#include
#include
#include
using namespace std;
int main()
{
    char *p=new char[50];
    char *pt=new char[50];
    char *h,*ht,*t,*hh,*hht;//h,hh用来保存p的头地址;ht,hht用来保存pt的头地址。
    h=p;ht=pt;hh=p;hht=pt;
    *(p++)='\0';//将p块的第一个单位赋值为'\0',并移到下一个单位。
    int flag=0;//记录该字符前连续出现的空格数。若为0,则说明该字符之前没有空格,也就是说它前面为字母,或者为串的结尾。

    gets(p);
    while(*(p+1)!='\0')
    {
        p++;//倒序遍历,从最后一个字符开始。
    }
    while(*p!='\0')
    {
        if (*p==' ')
        {
            if(flag==0)//flag=0,说明该字符之后为字母,应该将这些字母放入pt。
            {
                t=(p+1);//从后面一个非空格字母开始,到'\0'结束。将它们复制到pt中。
                while(*t!='\0')
                {
                    *pt=*t;
                    t++;
                    pt++;
                }
            }
            *(pt++)=' ';//在pt中增加一个空格。
            flag++;//p中连续空格数+1
            *p='\0';//将该空格置为'\0',以便作为下一次将字母复制到pt中时的结尾符。
        }
        else
        {
            flag=0;//如果不为空格,则将flag清零。
        }
        p--;//p继续往前走。
    }
    //此时p指向p块的第一个单位,里面是'\0'。
    t=p+1;//如果第1个单词前面没有空格的话,则就不会将该字母写入pt。这里是为了将其写入pt。
    //如果第一个单词前面有空格,则这一步不会复制任何东西到pt。因为*t=‘\0’。
    while(*t!='\0')
    {
        *pt=*t;
        t++;
        pt++;
    }
    *pt='\0';//复制完毕,将pt的最后一个字符设置为'\0'。

    while(*ht!='\0')//将pt中的内容重新复制到p中。ht指向pt块的首地址,h指向p块的首地址。
    {
        *h=*ht;
        h++;
        ht++;
    }
    *h='\0';//在p的最后添加上结束符。

     delete hht;//删除pt块。
     cout<

另一种方法:先将字符串全部倒置,然后再将其中的单词一个个倒置,将空格跳过。程序员面试宝典P228.

#include
#include
using namespace std;

int main()
{
    string str;
    char temp;
    getline(cin,str);
    int i=0,beg=0,ed=0;
    i=str.length()-1;
    beg=0;
    ed=i;
    while(beg



你可能感兴趣的:(将一句话里的单词进行倒置,标点符号不倒换。)