要求:将参数字符串中的字符反向排列,不是逆序打印。
一、思路
1.思考如何将字符串abcdef变成fedcba?
eg.
则代码如下
#include<stdio.h>
#include<string.h>
void reverse_string(char* str)
{
int len = strlen(str);
char temp = *str;
*str = *(str + len - 1);
*(str + len - 1) = temp;
reverse_string(str + 1);
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);//设计了一个叫做reverse_string的函数用来实现字符串逆序
printf("%s\n", arr);
return 0;
}
当你交换a、f时'\0'它是在f后面的。
但是,当你交换b、e时'\0'还是在f后面,这就会导致b、a(f原来的位置)进行交换。
过程是先绿再蓝。
2.思考,那该怎么办?——将'\0'提前
但是如果已经将a放到了位置5的,你再将'\0'提前,那a就不见了。
所以应该先提'\0',再移动a。
即,代码如下:
#include<stdio.h>
#include<string.h>
void reverse_string(char* str)
{
int len = strlen(str);
char temp = *str;
*str = *(str + len - 1);
*(str + len - 1) = '\0';
reverse_string(str + 1);
*(str + len - 1) = temp;
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
发现以上代码会造成死递归,
3.思考,如何更改,即如何限制?
大于等于两个字符才有必要逆序
二、代码
#include<stdio.h>
#include<string.h>
void reverse_string(char* str)
{
int len = strlen(str);
char temp = *str;
*str = *(str + len - 1);
*(str + len - 1) = '\0';
if(strlen(str+1)>=2)
reverse_string(str + 1);
*(str + len - 1) = temp;
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}