要想让输入的字符串倒序输出有很多种方法,我们可以用字符串处理函数,也可以将字符数组内的元素进行交换,在这里,我们用递归的方式来封装一个可以将字符串倒序输出的函数。
首先我们知道,递归程序层层递归,在递归之后的程序一定是最后才执行的,既然我们要倒序打印字符串,第一个字符一定是最后才打印的,然而很巧的是,我们这个倒序输出函数传址传的也是第一个字符的地址,所以我们就可以写成
void reverse_string(char* string)
{
reverse_string(string+1);
printf("%c",*string);
}
但是递归是需要条件的,若没有条件,则会无限递归下去,我们得找一个条件让它停下来。
我们知道,字符串的最后一个字符是 ’ \0 ’ ,那么当我们遇见 ’ \0 ',是不是就意味着就不用继续调用递归了呢?
假设可以,我们来试试结果
void reverse_string(char* string)
{
if(*(string)!='\0')
{
reverse_string(string+1);
}
printf("%c",*string);
}
如果递归到最后一个字符时, string + 1 就是 ‘\0’ 的地址,当不满足条件,将从 ‘\0’ 开始打印,那我们所作的努力都会前功尽弃。所以我们就得在确保第一个字符不是 *’\0’*的情况下判断下一个字符到底是不是 ‘\0’
可以写成
void reverse_string(char* string)
{
if(*(string+1)!='\0')
{
reverse_string(string+1);
}
printf("%c",*string);
}
也可以写成
void reverse_string(char* string)
{
if (*(++string) != '\0')
{
reverse_string(string);
}
printf("%c",*(string-1));
}
通过这样的层层递归,最终我们得到了我们想要的结果。
下面是这个递归程序的原理图以及供参考的代码:
void reverse_string(char* string)
{
if (*(++string) != '\0')
{
reverse_string(string);
}
printf("%c",*(string-1));
}
int main()
{
char arr[10] = "";
scanf("%s",arr);
reverse_string(arr);
return 0;
}