方法一:
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024
int main()
{
char str[MAXSIZE],d;
gets(str);
int len = strlen(str);
for (int i = 0;i < len-1;++i)
{
for (int j = 0;j < len - i - 1;++j)
{
d = str[j];
str[j] = str[j + 1];
str[j + 1] = d;
}
}
for (int i = 0;i < len;++i)
printf("%c", str[i]);
printf("\n");
return 0;
}
方法二:普通逆序,额外分配空间
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024
char *Reverse(char *s,int n)
{
char *q = s;
//遍历字符串,当指针指向'\0'时循环结束
while (*q)
*q++;
//令q指针指向最后一个字符
q -= 1;
char *p = (char*)malloc(n);
char *r = p;
//字符串逆序交换
while (q >= s)
*p++ = *q--;
*p = '\0';
return r;
}
int main()
{
char str[MAXSIZE];
gets(str);
int len = strlen(str);
printf("%s\n", Reverse(str,len));
return 0;
}
方法三:原地逆序,不允许额外分配空间,设置两个指针分别指向字符串头部和尾部,然后交换两个指针所指的字符,并向中间移动指针直到交叉
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024
char *Reverse(char *s)
{
char *p = s;
char *q = s;
while (*q)
++q;
q--;
while (q > p)
{
char t = *p;
*p = *q;
*q = t;
p++;
q--;
}
return s;
}
int main()
{
char str[MAXSIZE];
gets(str);
int len = strlen(str);
printf("%s\n", Reverse(str));
return 0;
}
方法四:递归,不额外分配空间
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024
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 str[MAXSIZE];
gets(str);
int len = strlen(str);
printf("%s\n", Reverse(str,0,len-1));
return 0;
}
方法五:非递归,不额外分配空间
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024
char *Reverse(char *s,int left,int right)
{
while (left < right)
{
char t = s[left];
s[left] = s[right];
s[right] = t;
++left;
--right;
}
return s;
}
int main()
{
char str[MAXSIZE];
gets(str);
int len = strlen(str);
printf("%s\n", Reverse(str,0,len-1));
return 0;
}
方法五:异或,不允许分配额外空间,不允许使用临时变量
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024
char *Reverse(char *s)
{
char *p = s;
char *q = s;
while (*(p + 1) != '\0')
{
++p;
*p = *p^*q;
*q = *p^*q;
*p = *p^*q;
++q;
--p;
}
return s;
}
int main()
{
char str[MAXSIZE];
gets(str);
int len = strlen(str);
printf("%s\n", Reverse(str));
return 0;
}
方法六:利用字符串结束符'\0'所在位置作为交换空间,不允许分配额外空间,不允许使用临时变量
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024
char *Reverse(char *s)
{
char *r = s;
char *p = s;
char *q = s;
while (*p != '\0')
++p;
q = p - 1;
while (q > s)
{
*p = *q;
*q = *s;
*s = *p;
++s;
--q;
}
*p = '\0';
return r;
}
int main()
{
char str[MAXSIZE];
gets(str);
int len = strlen(str);
printf("%s\n", Reverse(str));
return 0;
}