题目:编写一个函数reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。
解题思路:
逆序字符串,就是将字符串第一位和最后一位,第二位和倒数第二位依次互换,然后依次按序互换。根据题目给定函数reverse_string(char * string),就让指针string指向第一个字符。因为不能使用字符串操作函数就自己写一个MyStrlen()函数用于求字符串长度,string+MyStrlen(string)-1指向最后一个字符串。用string++依次指向下一个元素。
如何指向第二个元素呢?自己再定义一个static(静态)变量time,这样time就不会被销毁。time记录逆序次数,逆序一次time++,用string+MyStrlen(string)-1-time指向倒数第n个数。而停止互换的条件就是当最中间的字符已互换过,用string<(string + MyStrlen(string) - 1 - time)作为判断条件。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
int MyStrlen(char arr[])
{
int count = 0;
int i = 0;
while (arr[i] != '\0')
{
count++;
i++;
}
return count;
}
char *reverse_string(char *string) {
assert(string);//判断字符串是否为空,若为空则不执行下面的代码
static int time = 0;
//若string小于(string + MyStrlen(string) - 1 - time)则继续互换
if (string<(string + MyStrlen(string) - 1 - time)) {
*string ^= *(string + MyStrlen(string) - 1 - time);
*(string + MyStrlen(string) - 1 - time) ^= *string;
*string ^= *(string + MyStrlen(string) - 1 - time);
time++;
reverse_string(++string);//递归
}
return string - 1;//返回第一次的地址,第一次传值++string已经使指针指向第二个数,所以要-1指向第一个
}
int main()
{
char string[] = "AbCdEfG";
char *ret;
ret = reverse_string(string);
printf("%s", ret);
return 0;
}
附上一个结果图
最后,如果有疑问欢迎评论区留言提问呦,谢谢……