题目要求
编写一个 reverse_string(char * str)函数
利用递归实现将参数字符串中的字符反向排列,不是逆序打印。不能使用C函数库中的字符串操作函数。
eg :char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
主函数
int main()
{
char arr[] = "abcdef";
printf("%s\n", arr);//打印内容变更前
reverse_string(arr);
printf("%s\n", arr);//打印内容变更后
system("pause");//在Visual Studio 2013中显示结果
return 0;
}
交换函数
根据题目我们能想到的是
先将"abcdef"-> “fbcdea”,a和f交换
再将"fbcdea"-> “fecdba”;b和e交换
最后"fecdba"-> “fedcba”;c和d交换
因此我们先写出一个交换函数
//利用异或实现交换问题(上篇文章有详细的解说👆)
void swap(char *a, char *b){
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
reverse_string函数
按照题目要求编写reverse_string函数
void reverse_string(char * str){
if (NULL == str){//当传入的函数为空时
return;
}
reverse_string_helper(str, 0, strlen(str)-1);
}
reverse_string_helper函数
为了能够实现从两边向内逐字更换字符,编写一个新函数
void reverse_string_helper(char * str, int start, int end)
start:从左往右所指向的字符
end:从右往左所指向的字符
void reverse_string_helper(char * str, int start, int end){
if (start >= end){//判断遍历是否结束
return;
}
swap(&str[start++], &str[end--]);//向中间遍历
//注意start++和end--先赋值在自增,因此下面递归时start和end数值已经更新
reverse_string_helper(str,start,end);//递归调用进行下次一交换
}
结果
因此,我们得到结果为
欢迎大家评论,一起努力一起进步呐~
喜欢的小伙伴,下方点个赞呦~