关于翻转字符串

编程珠玑中的一个方法。

移动字符串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(" ");

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

    printf(str);
    printf(" ");

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

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

    printf(str);
    printf(" ");
}

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

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

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

#include <stdio.h>

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

  

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

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

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

    printf(str);
    printf(" ");
}

原文地址:https://www.cnblogs.com/heiming/p/5775890.html