编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = "abcdef";
逆序后数组的内容变成:fedcba
1.递归实现
1.1解题思路
对于字符串“abcdefg”,递归实现的大概原理:
1. 交换a和g,
2. 以递归的方式逆置源字符串的剩余部分,剩余部分可以看成一个有效的字符串,再以类似的方式逆置
如:
reverse_string("abcdefg")
g + reverse_string("bcdef") + a
g + f +reverse_string("cde") +b + a
………
g f e d c b a
1.2代码
#include <stdio.h>
int my_strlen(char* str)
{
int count = 0;
while ('\0' != *str)
{
count++;
str++;
}
return count;
}
void reverse_string(char* string)
{
int len = my_strlen(string);
char tmp = *string;
*string = *(string + len - 1);
*(string + len - 1) = '\0';
if (my_strlen(string+1) > 1)
reverse_string(string+1);
*(string + len - 1) = tmp;
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
1.3注意事项
在调用递归以前,要将right指向的值暂时更改为'\0',以便识别。
在递归完成以后,再将right指向的值用tmp替换进去。
2.非递归实现(参数用指针/数组的方式)
2.1解题思路
逆置字符串,循环的方式实现非常简单
1. 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置
2. 交换两个指针位置上的字符
3. left指针往后走,right指针往前走,只要两个指针没有相遇,继续2,两个指针相遇后,逆置结束
2.2代码
#include<stdio.h>
#include <string.h>
int my_strlen(char* str)
{
int count = 0;
while ('\0' != *str)
{
count++;
str++;
}
return count;
}
//参数用指针的形式
void reverse_string(char* str)
{
char* left = str;
char* right = str + my_strlen(str) - 1;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
参数是数组的形式
//void reverse_string(char arr[])
//{
// int left = 0;
// int right = my_strlen(arr) - 1;
//
// //交换
// while (left < right)
// {
// char tmp = arr[left];
// arr[left] = arr[right];
// arr[right] = tmp;
//
// left++;
// right--;
// }
//}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr); //fedcba
return 0;
}