我们可以使用递归来逆序输入的字符串:
#include<stdio.h>
void reverse();
int main()
{
printf("输入:");
reverse();
return 0;
}
void reverse()
{
char c; //这里每个函数都分配一个变量c
scanf("%c",&c);//给本次递归变量c赋值
if(c!='\n')
{
reverse();//读取下个字符
printf("%c",c);//打印这次读取到的值
}
}
在打印读入本次读入的字符之前,先读入下一个字符,因为没有读到回车符‘\n’.递归会一直下去。直到读到回车符,递归才返回,然后倒数第二次调用 的printf()语句才可以执行
这时候它读入的是倒数的第二个字符(倒数第一个字符是回车符)。然后倒数第二次的调用结束返回。倒数第三次调用的printf()语句得以执行。
因为先输入的要等待后输入的,后输入的先行打印。从而达到逆序的效果。
运行结果:
输入:123.456abc
cba654.321
Process returned 0 (0x0) execution time : 7.499 s
Press any key to continue.
上面的代码已经达到了逆序输出的效果了。但是我想保存逆序的结果怎么办。
这时候就要有个容器来保存结果,我这里使用动态的一维字符数组来保存。并且在递归最后一次返回的时候返回这个动态数组,而不是每次都返回,这里使用静态的变量来统计递归的次数,静态的变量是整个递归函数的。只分配一次内存空间。
/**
reverse.c
*/
#include<stdio.h>
#include<stdlib.h>
char* reverse();
int main()
{
char *p;
printf("输入:");
p=reverse();
printf("保存下来的结果:");
while(*p!='\0')
{
printf("%c",*p);
p++;
}
return 0;
}
char* reverse()
{
char c;
scanf("%c",&c);
static int count=0;//统计读入多少字符,
static int index=0;//逆序的动态一维数组的下标
static char *array;//动态一维数组的指针
if(c=='\n')//结束的时候,
{
//动态一维数组比实际的字符个数多一个
//最后一个放入结束符'\0'
count++;
//生成动态一维数组
array=(char*)malloc(sizeof(char)*count);
*(array+count-1)='\0';//一维下标从0开始。
printf(" maxcount=%d\n",count);
}
if(c!='\n')
{
count++;
reverse();
*(array+index)=c;
printf("%c",c);
index++;
printf(" index=%d\n",index);
}
//控制返回,只有在最后一次退出递归函数时才返回结果。
if((index+1)==count)
{
printf("返回了哦\n");
return array;
}
}
结果:
输入:123.456.abc
maxcount=12
c index=1
b index=2
a index=3
. index=4
6 index=5
5 index=6
4 index=7
. index=8
3 index=9
2 index=10
1 index=11
返回了哦
保存下来的结果:cba.654.321
Process returned 0 (0x0) execution time : 7.073 s
Press any key to continue.