编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = "abcdef";
逆序之后数组的内容变成:fedcba
#include <stdio.h>
int my_strlen(char* string)
{
int count = 0;
while (*string != 0)
{
count++;
string++;
}
return count;
}
void reverse_string(char* string)
{
char tmp = *string;
int len = my_strlen(string);
*string = *(string + len - 1);
*(string + len - 1) = '\0';
if (my_strlen(string + 1) >= 2)
{
reverse_string(string + 1);
}
*(string + len - 1) = tmp;
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
这道题其实蛮难想的
首先跳出递归的条件无疑是字符串长度>=2,因为只有1个字符的时候不需要逆序。
有了这个条件就顺着想,我要逆序abcdef,为什么不逆序bcde->cd
首先肯定是从数组0和最后一个了,因为如果你要从里面cd开始交换,明显不好找,你找中间很难,所以从0和最后一个开始换
其实具体思路是这样的。
void reverse_string(char* string)
{
char tmp = *string;
int len = my_strlen(string);
*string = *(string + len - 1);
*(string + len - 1) = '\0'; //abcdef
//这里把最后一位也就是f置成0是因为 1.不置0,下面的string+1就是b又会和f换,就换乱了
2.置0就让string+len-1找到下一次b和e交换。
if (my_strlen(string + 1) >= 2)
{
reverse_string(string + 1);
}
*(string + len - 1) = tmp; //这里如果你把这句话放到if前边,那么就会变成fbcdea,并且假设你
也没把最后一位置零,那么下一次递归进去,b又会和a交换,a不应该
参与进来,而应该再每次递归结束后,再补进来。
思路即为:d 0
不进入递归
d c
e d c 0
e d c b
f e d c b 0
f e d c b a
}
笔记:
说上图突然有个疑问,为什么00CFFE20 00CFFE24 00CFFE28
怎么这些地址都差4呢,废话,你存的是Int类型,不是占了4个字节嘛。(又涉及到原码反码补码和小端存储问题)。