第一种递归方式实现:例如下边这个程序,第一次把a取出来,存放在临时变量中,将f放到a的位置,再将原来f的位置换为’\0’,再让针针指向以b为首地址的字符串,以此类推,直到指向的下一个字符串的长度不在大于一,递归调用函数结束,输出一系列递归值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
void reverse(char *str)
{
assert(str != NULL);
int len = strlen(str);
int tmp = *str;
*str = *(str + len - 1);
*(str + len - 1) = '\0';
if (strlen(str + 1) > 1)
reverse(str + 1);
*(str + len - 1) = tmp;
}
int main()
{
char a[] = "abcdef";
reverse(a);
printf("%s\n",a);
system("pause");
return 0;
}
给函数传递字符串的首位地址,用指针交换最左边和最右边的字符,以此类推,不断向中间靠拢。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
void reverse(char *start, char *end)
{
assert(start);
assert(end);
while (start < end)
{
char tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
int main()
{
char a[] = "abcedf";
int len = strlen(a) - 1;
reverse(a,a+len);
printf("%s\n",a);
system("pause");
return 0;
}
直接传给函数字符串的首地址,创建临时变量来交换左右字符。交换的次数为 :字符串长度/2.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
void reverse(char *str)
{
assert(str);
char *p = str;
char tmp = *str;
while (*str)
{
int i = 0;
for (i = 0; i < strlen(p) / 2; i++)
{
int len = strlen(str);
char tmp1 = *str;
*str = *(str + len - 1 -i);
*(str + len - 1-i) = tmp1;
str++;
}
break;
}
}
int main()
{
char a[] = "abcdefg";
reverse(a);
printf("%s\n",a);
system("pause");
return 0;
}