编写一个函数 reverse_string(char * string)(递归实现),将参数字符串中的字符反向排列,不是逆序打印。
(要求:不能使用C函数库中的字符串操作函数。)
(在本次练习中,由于对自增理解不到位,迷糊了好一会,写错了一次。在与朋友讨论后搞懂了,所以在这里记录一下,以免再犯。)
以下内容记录了代码、运行结果以及递归过程,便于理解。
1. 实现字符串逆序
1.1 代码
#include <stdio.h>
int reverseString(char* string) {
if (*(++string) != '\0') {
reverseString(string);
}
printf("%c", *(string-1));
}
int main() {
char *string = "abcd";
reverseString(string);
printf("\n");
system("pause");
return 0;
}
1.2 运行结果
1.3 递归过程
2. 实现字符串逆序(但是最后一位多打印了一遍)
2.1 代码
#include <stdio.h>
int reverseString(char* string) {
if (*string != '\0') {
string++;
reverseString(string);
}
printf("%c", *(string-1));
}
int main() {
char *string = "abcd";
reverseString(string);
printf("\n");
system("pause");
return 0;
}
2.2 运行结果
2.3 递归过程
3 总结
在两段代码中,不同之处在于对指针string自增的顺序,是先增加1还是后增加1。
在1.1中,先自增再判断,就能够发现能够完成所有字符的逆序,不会将最后一位多打印一遍。而在2.1中,由于先判断当前字符是否为\0,在增加1,使得在当前函数运行结束后,指针指向了下一个字符。(可能总结的不到位,结合递归过程的图或许更好理解些)
最后一次判断当前字符为\0,接着打印就不用说了,打印的就是d。但在返回到倒数第二次递归函数中时,因为此时指针已经指向了\0,所以打印其前一位字符时,打印了d。 所以最后运行结束后,会发现,打印内容会出现两次d(最后一位)。