如何将字符串逆序

方法一:普通逆序。直接分配一个与愿字符串登场的字符数组,然后反向拷贝即可。

代码如下:

#include "stdafx.h"
#include <stdio.h>
char *Reverse(char *s)
{
    char *q = s;
    while (*q)q++;
    q=q-1;
    char *p = new char[sizeof(char)*(q - s + 2)];
    char *r = p;
    //逆序存储
    while (q >= s)
    {
        *p = *q;
        p++;
        q--;
    }
    *p = '\0';
    return r;
}
int main()
{
    char a[] = "abcd";
    int len = sizeof(a) / sizeof(a[0]);
    printf("%s\n", Reverse(a));
    getchar();
    return 0;
}

方法二:双指针原地逆序。设置两个指针,分别指向字符串的头部和尾部,然后交换两个指针所指的字符,并向中间移动指针直到交叉。

代码如下:

#include "stdafx.h"
#include <stdio.h>
char *Reverse(char *s)
{
    char *p = s;
    char *q = s;
    while (*q) q++;
    q--;
    while (q > p)
    {
        char t = *p;
        *p = *q;
        p++;
        *q = t;
        q--;
    }
    return s;
}
int main()
{
    char a[] = "abcd";
    printf("%s\n", Reverse(a));
    getchar();
    return 0;
}

方法三:递归原地逆序。指定逆序区间,借用一个中间变量,每次将首尾字符互换。

代码如下:

#include "stdafx.h"
#include <stdio.h>
char *Reverse(char *s, int left, int right)
{
    if (left >= right)
        return s;
    char t = s[left];
    s[left] = s[right];
    s[right] = t;
    Reverse(s, left + 1, right - 1);
}
int main()
{
    char a[] = "abcd";
    printf("%s\n", Reverse(a,0,3));
    getchar();
    return 0;
}

方法四:非递归原地逆序。指定逆序区间,使用while循环从两头开始不断交换首尾字符,直到全部交换完毕。

    代码如下:

#include "stdafx.h"
#include <stdio.h>
char *Reverse(char *s, int left, int right)
{
    while (left < right)
    {
        char t = s[left];
        s[left] = s[right];
        left++;
        s[right] = t;
        right--;
    }
    return s;
}
int main()
{
    char a[] = "abcd";
    printf("%s\n", Reverse(a, 0, 3));
    getchar();
    return 0;
}

方法五:异或原地逆序。先将要交换的两个变量异或,结果保存在其中一个变量中。然后与另一个变量异或并将结果赋值给该变量,再与该变量异或并将结果赋值给另一个变量。

代码如下:

#include "stdafx.h"

#include <stdio.h>

char* Reverse(char* s)

{

char* r = s;

char* p = s;

while (*(p + 1) != '\0') ++p;

while (p > s)

{

*p = *p^*s;

*s = *p^*s;

*p = *p^*s;

s++;

p--;

}

return r;

}

int main()

{

char a[] = "abcd";

int len = sizeof(a) / sizeof(a[0]);

printf("%s\n", Reverse(a));

getchar();

return 0;

}

方法六:结束符做交换空间,即使用字符串结束符\0所在的位置作为交换空间,交换完毕后再将其置为\0

代码如下:

#include "stdafx.h"
#include <stdio.h>
char* Reverse(char* s)
{
    char* r = s;
    char* p = s;
    while (*p != '\0') p++;
    char* q =p - 1;
    while (q > s)
    {
        *p = *q;
        *q = *s;
        *s = *p;
        s++;
        q--;
    }
    *p = '\0';
    return r;
}
int main()
{
    char a[] = "abcd";
    printf("%s\n", Reverse(a));
    getchar();
    return 0;
}

    效果如图:

posted @ 2014-03-24 11:24  源子陌  Views(1211)  Comments(0Edit  收藏  举报