关于翻转字符串

编程珠玑中的一个方法。

移动字符串ABCD EFG  变为 EFG ABCD,可以看成是一个字符串的翻转问题。

ABCD为 x, EFG为y, 翻转x后得到DCBA,翻转y后得到GFE,那么翻转DCBAGFE得到EFGABCD。

 

另面试题:写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数。

#include <stdio.h>

int main()
{
    char str[]="you are a student";
    printf(str);
    printf("\n");

    char *p,*q;
    char temp;
    p=q=str;
    while(*q!='\0')
    {
        q++;
    }
    q--;
    while(p<=q)
    {
        temp=*p;
        *p=*q;
        *q=temp;
        p++;
        q--;
    }//反转整个字符串

    printf(str);
    printf("\n");

    char *s;
    q=p=s=str;//指针指向开始位置
    while(*q!='\0')
    {
        if(*q==' '||*(q+1)=='\0')
        {
            p--;
            if(*(q+1)=='\0')//处理最后一个字串
                p++;
            while(s<=p)
            {
                temp=*p;
                *p=*s;
                *s=temp;
                s++;
                p--;
            }//反转局部字符串

            s=q+1;
            p=q;
        }
        q++;
        p++;
    }

    printf(str);
    printf("\n");
}

 

一、首先翻转整体,然后翻转局部,局部被翻转两次,又顺序回来。

二、其实先翻转局部和先翻转整体是一样的。只要保证局部被翻转两次,就可以又得到顺序。

如上代码将整体和局部翻转的代码换个位置,一样可以得到正确结果。

#include <stdio.h>

int main()
{
    char str[]="you are a student";
    printf(str);
    printf("\n");

  

    char *s;
     char *p,*q;
    char temp;
    q=p=s=str;//指针指向开始位置
    while(*q!='\0')
    {
        if(*q==' '||*(q+1)=='\0')
        {
            p--;
            if(*(q+1)=='\0')//处理最后一个字串
                p++;
            while(s<=p)
            {
                temp=*p;
                *p=*s;
                *s=temp;
                s++;
                p--;
            }//反转局部字符串

            s=q+1;
            p=q;
        }
        q++;
        p++;
    }

    printf(str);
    printf("\n");
   
    p=q=str;
    while(*q!='\0')
    {
        q++;
    }
    q--;
    while(p<=q)
    {
        temp=*p;
        *p=*q;
        *q=temp;
        p++;
        q--;
    }//反转整个字符串

    printf(str);
    printf("\n");
}

posted @ 2016-08-16 11:55  梦中山河  阅读(222)  评论(0编辑  收藏  举报