一、题目描述
编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。
1、方法一:递归实现
思路:先将最后字符放到第一个数的地址,为了可以判断下一次交换是否结束,把最后一个字符换为‘\0’ 。再将第二个字符和倒数第二个字符交换后,再将第一个数放到最后一个字符的地址。直到字符串长度为1或0时,停止交换。
递归限制条件:字符串长度<=1时,停止递归。
#include <stdio.h>
#include <assert.h>
int my_strlen(char* str)
{
assert(str != NULL);
int count = 0;
while(*str++)
{
count++;
}
return count;
}
char reverse_string(char* str)
{
int len = my_strlen(str);
char tmp = *str; //交换第一个字符和最后一个字符
(*str) = *(str + len-1);
*(str + len - 1) = '\0';
//逆序除过两端字符的中间的字符串
if (my_strlen(str + 1) >= 2)
reverse_string(str + 1);
*(str + len - 1) = tmp;
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s", arr);
return 0;
}
2.方法二:
思路:第一个和最后一个交换,第二个和倒数第二个交换...
#include <stdio.h>
#include <assert.h>
int my_strlen(char* str)
{
assert(str != NULL);
int count = 0;
while(*str != '\0')
{
count++;
str++;
}
return count;
}
void reverse_string(char* str)
{
int len = my_strlen(str);
char* left = str;
char* right = len + str - 1;
assert(str != NULL);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}