题目如下:
编写一个函数 reverse_string(char* string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = "abcdef";
逆序之后数组的内容变成:fedcba
第一种方法:
解决思路:根据题目可知,这里的字符串逆序并不是指逆序打印,而是真实地改变了原字符数组中的存储内容,即arr内元素位置的变更。通过传址调用,将数组名传入,函数元素内部通过操作原数组首元素地址对应的值和尾元素地址对应的值交换,左右下标值依次递增递减,以此类推。
//1
#include<stdio.h>
void reverse_string(char arr[])
{
int left = 0;
int right = strlen(arr)-1;
//交换
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);//fedcba
return 0;
}
第二种方法:
要求:不能使用C函数库中的字符串操作函数
通过指针的形式传递的方法实现,字符串中的字符反向排列
#include<stdio.h>
int my_strlen(char* s)
{
int count = 0;
while (*s != '\0')
{
count++;
s++;
}
return count;
}
void reverse_string(char* str)
{
char* left = str;
char* right = str + my_strlen(str) - 1;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdefg";
reverse_string(arr);
printf("%s\n", arr);//fedcba
return 0;
}
第三种方法:递归版本
解决思路:使用递归,缩小问题规模。将数组中首尾两个元素交换,当满足一定条件时,调用递归,转换为次首元素和次尾元素交换。为了使相交换的两个元素的位置能不断变化,故每次交换时需要将第二个元素位置为'\0', 第一个元素拷贝到交换变量tmp中,带递归结束后再将tmp(即每组交换中第一个元素的值)赋组给每组交换的第二个元素。
#include<stdio.h>
int my_strlen(char* s)
{
int count = 0;
while (*s != '\0');
{
count++;
s++;
}
return count;
}
//a b c d e f
//递归版本
void reverse_string(char* arr)
{
int len = my_strlen(arr);
char tmp = *arr;
//printf("%c\n", tmp);
*arr = *(arr + len - 1);
*(arr + len - 1) = '\0';
if (my_strlen(arr+1) > 1)
reverse_string(arr + 1);
*(arr + len - 1) = tmp;
}
int main()
{
char arr[] = "abcdefg";
reverse_string(arr);
printf("%s\n", arr);//fedcba
return 0;
}