目录
嗨大家好!
本篇博客中的这道例题,是我自己在一次考试中写错的一道题
这篇博客包含了这道题的几种解法,以及一些我自己对这道题的看法,希望能够帮到大家
一、题目要求
编写一个函数 reverse_string(char * string)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = "abcdef";
逆序之后数组的内容变成:fedcba
二、解题步骤
这道题分为两种实现方法:一是递归实现,二是循环实现
①递归解法
思路
| 对于字符串“abcdefg”,递归实现的大概原理: |
| 1. 交换a和g, |
| 2. 以递归的方式逆置源字符串的剩余部分,剩余部分可以看成一个有效的字符串,再以类似的方式逆置 |
完整代码
void reverse_string(char* arr)
{
int len = strlen(arr);
char tmp = *arr;
*arr = *(arr+len-1);
*(arr+len-1) = '\0';
if(strlen(arr+1)>=2)
reverse_string(arr+1);
*(arr+len-1) = tmp;
}
②循环解法
思路
| 1. 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置 |
| 2. 交换两个指针位置上的字符 |
| 3. left指针往后走,right指针往前走,只要两个指针没有相遇,继续2,两个指针相遇后,逆置结束 |
完整代码
void reverse_string(char* arr)
{
char *left = arr;
char *right = arr+strlen(arr)-1;
while(left<right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
不难看出,循环写法理解起来比较容易,而递归写法虽然较难被想到,但整体会更简洁
对于刚入门的同学,多积累一种办法才是最重要的,学到后期再去考虑要用哪种更省内存、效率更高的写法
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!
递归与循环解法:字符串逆序排列,

文章介绍了如何在不使用C库函数的情况下,通过递归和循环两种方法实现字符串的字符反向排列。递归解法涉及交换首尾字符并递归处理子串,而循环解法则使用两个指针从两端向中间交换字符。作者认为,循环解法更易理解,但递归解法更简洁,适合初学者学习。
5166

被折叠的 条评论
为什么被折叠?



