如何将字符串逆序
方法一:普通逆序。直接分配一个与愿字符串登场的字符数组,然后反向拷贝即可。
代码如下:
#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; }
效果如图: