求c语言大神详细说明这个程序(输入字符串,然后反向输出)

#include <stdio.h>
void reverse()
{
char c;
if((c = getchar()) != '\n')
reverse();
if(c != '\n')
putchar(c);
}

void main()
{
reverse();
printf("\n");

}

//原程序:
#include <stdio.h>
void reverse()
{
    char c;                    
    if((c = getchar()) != '\n') /*c =getchar()先把键入的一个字符赋值给c,再判断                                   é”®å…¥çš„是否为回车*/
        reverse();              /*若当前键入不是回车,再次调用一次自定义函数,注                                  æ„æ­¤æ—¶ç¬¬ä¸€æ¬¡è°ƒç”¨è¿˜æ²¡æœ‰ç»“束;若当前键入回车,即                                   è¾“入字符串结束符时,则无任何操作,进入下一轮判                                  æ–­*/
    if(c != '\n')               /* å¦‚果当前不是回车就输出当前的字符。由于最后一                                    ä¸ªå­—符必定是回车所以最后一次调用相当于无任何                                     æ“ä½œï¼Œæ­¤æ—¶å‡½æ•°å¹¶ä¸æ˜¯ç»“束,而是返回上一层调用                                    ç‚¹å³å€’数第二次调用,去执行上次未执行的语句if                                    (c != '\n') putchar(c);这时就输出了倒数第一                                     ä¸ªéžç©ºå­—符,此后再返回倒数第三次调用的断点输                                   å‡ºå€’数第二个非空字符,以此类推……实现倒序输                                    å‡ºã€‚*/
        putchar(c);
}

void main()
{
    reverse(); //程序开始,第一次调用自定义函数reverse()
    printf("\n");

}

//我的程序:
#include<stdio.h>
#include<string.h>
void main()
{
 char a[100];
 int i,j;
 printf("请输入一个字符串:");
 scanf("%s",&a);
 j=strlen(a);
 printf("它的倒序字符串为:");
 for(i=j-1;i>=0;i--)
   printf("%c",a[i]);
 printf("\n");
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-04-30
reverse()函数有递归调用,当你输入abcdef时,

第1次调用:c=a,
第2次调用:c=b,
第3次调用:c=c,
第4次调用:c=d,
第5次调用:c=e,
因为前面的调用必须在后面的调用执行完后才执行putchar(c);所以

最后一次调用并输出:e,然后返回上一层调用,输出d,再返回上一层调用,输出c,依次类推,追问

还是有点不明白,

第1次调用:c=a,
第2次调用:c=b,
第3次调用:c=c,
第4次调用:c=d,
第5次调用:c=e,
第6次调用:c='\n'
之后执行

if(c != '\n')
putchar(c);
应该是什么都没有啊
希望解答,刚开始学c语言,很多不懂

追答

第六次因为c=‘\n’了,不满足while的条件,所以没执行while‘循环了,也就是没继续调用reverse()了, 而是执行下一句putchar(c);执行完之后返回上一层调用。

本回答被提问者和网友采纳