编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = "abcdef"逆序之后数组的内容变成:fedcba
方法一:
首先定义逆序函数,用数组储存字符串,根据下标进行比较(这里可以定义一个函数用来计算字符串的长度),从最左边的数字和最右边的数字开始,进行循环比较,条件为left<right时进行,交换两数,当次条件不成立时,结束循环。打印此时的数组。
#include<stdio.h>
size_t my_strlen(char* string)
{
if (*string == '\0')
return 0;
else
return 1 + my_strlen(string + 1);
}
//逆序函数
void reverse_string(char* string)
{
size_t left = 0;
size_t right = my_strlen(string) - 1;
while (left < right)
{
char num = string[left];
string[left] = string[right];
string[right] = num;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s ", arr);
return 0;
}
方法二:
这里采用了递归的方法。先捕捉最左和最右两个数,然后将前面的数赋值给tmp,将后面的数赋值给前面的数,再将\0赋值给后面的数。然后再进行判断,如果剩下的字符个数>=2,就继续将后面的字符进行逆序函数的调用。直到中间的字符个数=0或者1时停止递归。最后把tmp再赋值给最后的那个数。
注意:不用考虑最后tmp的值会不会被别的数代替,因为每调用一次reverse_string函数就会开辟一个新的空间,都有各自的tmp。
这里也可以像“方法一”一样定义一个my_strlen函数,用来计算字符串的长度。
#include <stdio.h>
#include <string.h>
void reverse_string(char s[])
{
size_t len = strlen(s);
char tmp = s[0];
s[0] = s[len - 1];
s[len - 1] = '\0';
if (strlen(s + 1) >= 2)
reverse_string(s + 1);
s[len - 1] = tmp;
}
int main()
{
char arr[] = "abcdefg";
reverse_string(arr);
printf("%s\n", arr);//fedcba
return 0;
}