题目要求
将参数字符串中的字符反向排列,不是逆序打印。输入字符串“abcdef”,逆序之后数组要求变成“fedcba”
代码思路
字符串 a b c d e f ,反向排列也就让字符两两互换位置,分别是a和f互换,b和e互换,c和d互换,以此互换三次就可以实现反向排列。
代码实现
首先我们看不用递归的方法。函数reverse_string实现的是反向排列的功能,不需要返回值,所以用void而不是int,arr是实参,str是形参,需要用到传址调用,所以要用指针。
其中*(str + left) 和 str[left] 是一样的,只不过指针写法更加直观一些。
#include<stdio.h>
#include<string.h> //strlen需要用到的头文件
void reverse_string(char* str)
{
int left = 0;
int right = strlen(str) - 1;
while (left < right) //判断循环停止的条件
{
char tmp = *(str + left); //把最左边的字符放进中间变量里
*(str + left) = *(str + right); //把最右边的字符移到最左边
*(str + right) = tmp; //把最左边的字符移到最右边
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
递归实现
递归的显著特征就是大事化小,自己调用自己,让代码看起来更简洁。思路很上面类似。
首先我们想让a和f交换位置,然后剩下bcde,递归下去让b和e交换,但是这样行不通,因为再次调用reverse_string(每次调用让str+1,第二次从b开始看)后看到的是bcdea就不行了。所以要把a单独拿出来。于是就有了一下五个步骤:
第一步 :把a存放到中间变量
第二步:把末尾的f移到开头,也就是让a和f互换,但a没有放在末尾,而是暂时存放在中间变量
第三步:把原来f的位置写入 \0,也就是字符串终止的标志
第四步:现在从str+1看,只剩下bcde,使用递归
第五步:在所有字符互换结束后把a放在末尾
#include<stdio.h>
#include<string.h>
void reverse_string(char* str)
{
char tmp = *str; //第一步
int len = strlen(str);
*str = *(str + len - 1); //第二步
*(str + len - 1) = '\0'; //第三步
if (strlen(str + 1) >= 2)
{
reverse_string(str + 1); //第四步
}
*(str + len - 1) = tmp; //第五步
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}