题目要求:
编写一个函数reverse_string(char*string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数
比如:
char arr[]="abcdef"
逆序之后数组的内容变成:fedcba
解题思路:
- 先假定要逆序的字符串为arr[]=“abcdef”,那么arr[]存储的元素有'a','b','c','d','e','f','\0'。
- 将首位元素替换为末位元素(’\0‘之前的元素),替换后将末位元素替换为'\0'。
- 将未被替换的元素组成的子字符串取出,再次进行上述操作,直至子字符串中不在存在元素或只剩一个元素。
- 将被替换为'\0'换回。
补充:判断递归何时停止,可以通过 子字符串的长度来进行判断。但是题目要求不可以使用C函数库中的字符串操作函数,即strlen()函数来计算字符串长度。就需要写一个函数来实现计算字符串长度的功能。
函数如下:
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
代码实现:
#include <stdio.h>
int my_strlen(char* str) //用于计算字符串的长度
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
void reverse_string(char* str)
{
char tmp = *str;
int len = my_strlen(str);//求字符串长度
*str = *(str + len - 1);//首位元素换成末尾元素
*(str + len - 1) = '\0';//将当前末尾设为\0,这样下次递归就找的是未被交换过的元素
if (my_strlen(str+1)>=2)
{
reverse_string(str + 1);
}
*(str + len - 1) = tmp;//将\0换回该放的元素
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);//这里只传递了首元素的地址
printf("%s\n", arr);
return 0;
}
运行截图: