利用递归使字符串逆序(不是逆序打印)

题目要求

编写一个 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);//递归调用进行下次一交换
}

结果

经验分享 程序员 微信小程序 职场和发展