字符串逆序(递归实现)
编写一个函数 reverse_string(char* string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如 :
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
想法:在想递归之前,我们要先想常规方法要怎么做,首先编写函数求字符串的长度,然后让第一个元素和最后一个,第二个和倒数第二个交换,以此类推
代码:
#include<stdio.h>int Strlenth(char Str[]) {int count = 0;int i = 0;while (Str[i]!='\0'){count++;i++;}return count;
}void reverse_string(char* string) {char tmp;int len = Strlenth(string);tmp = *string;*string = *(string + len - 1);*(string + len - 1) = '\0';if (Strlenth(string+1)>1){reverse_string(string + 1);}*(string + len - 1) = tmp;//思考为什么以下写法结果会错误/*tmp = *string;*string = string[Strlenth(string) - 1];string[Strlenth(string) - 1] = '\0';if (Strlenth(string + 1) > 1){reverse_string(string + 1);}string[Strlenth(string) - 1] = tmp;*/
}
int main(){char Str[] = { "abcdefg"};reverse_string(Str);printf("%s\n", Str);return 0;
}
遇到的问题:
tmp = *string;*string = string[Strlenth(string) - 1];string[Strlenth(string) - 1] = '\0';if (Strlenth(string + 1) > 1){reverse_string(string + 1);}string[Strlenth(string) - 1] = tmp;
为什么这种写法会出现错误?
因为上述两个语句
1.string[Strlenth(string) - 1] = ‘\0’;
2.string[Strlenth(string) - 1] = tmp;
在同一次调用的过程中,它们的string[Strlenth(string) - 1] 得到的值并不相同,有\0的阻挡,它的长度发生了变化。而第一种方法用的是地址,不受\0的影响
若想继续这样用需改为以下代码
tmp = *string;*string = string[Strlenth(string) - 1];string[Strlenth(string) - 1] = '\0';if (Strlenth(string + 1) > 1){reverse_string(string + 1);}string[Strlenth(string)] = tmp;//修改了这句,使长度和原来相同