利用递归使字符串逆序(不是逆序打印)
题目要求
编写一个 reverse_string(char * str)函数
利用递归实现将参数字符串中的字符反向排列,不是逆序打印。不能使用C函数库中的字符串操作函数。
eg :char arr[] = “abcdef”; 逆序之后数组的内容变成:fedcba
主函数
int main() { char arr[] = "abcdef"; printf("%s ", arr);//打印内容变更前 reverse_string(arr); printf("%s ", 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);//递归调用进行下次一交换 }