编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如: char arr[] = "abcdef"; 逆序之后数组的内容变成:fedcba
这道题要求我们使用递归并且不使用字符串操作函数来实现字符串逆序,所以我们需要先自己编写求字符串长度函数,以便使用。
int my_strlen(char* arr) {
int count = 0;
while (*(arr+count) != '\0') {
count++;
}
return count;
}
因为逆序函数接口参数为char*string,所以我们在实现求字符串长度函数时,参数也需要是char*类型。
接下来我们来实现逆序函数
void reverse_string(char* string) {
int len = my_strlen(string) - 1;
char tmp = *string;
*string = *(string + len);
*(string + len) = '\0';
if (my_strlen(string + 1) > 2)
reverse_string(string + 1);
*(string + len) = tmp;
}
定义len使用我们编写的my_strlen计算字符串长度,便于确定位置,实现字符串的逆序操作,比如字符串为abcdef,此时字符串真实情况为"abcdef\0",\0为字符串的结束标志,我们用string确定字符串起始位置(即字符a),用string+len确定字符串末尾位置(即字符f),利用临时变量tmp将进行起始字符和末尾字符进行交换,然后进行递归即可(传入参数string+1),但是,仔细思考,我们在下一次进入函数时,字符串的长度只是左边减少(即bcdef\0),\0才是字符串的结束标志,我们再次交换会导致b和f进行交换,所以我们在将左边的字符放入右边前,先将右边的字符置为\0,使其变为结束标志(即下一次进入函数时字符串为"bcde\0"),便于之后递归,回来之后,再将左字符放入右边,另外,在递归时,还要判断剩余字符串长度是否需要继续递归,所以限制条件为my_strlen(string + 1) > 2。
最后附上完整代码和运行截图:
#include<stdio.h>
int my_strlen(char* arr) {
int count = 0;
while (*(arr+count) != '\0') {
count++;
}
return count;
}
void reverse_string(char* string) {
int len = my_strlen(string) - 1;
char tmp = *string;
*string = *(string + len);
*(string + len) = '\0';
if (my_strlen(string + 1) > 2)
reverse_string(string + 1);
*(string + len) = tmp;
}
int main() {
char arr[] = "abcdefghi";
printf("逆序前:%s\n", arr);
reverse_string(arr);
printf("逆序后:%s\n", arr);
return 0;
}
如有错误,还请指正。