免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2502 | 回复: 13
打印 上一主题 下一主题

有段代码看不懂,请帮忙 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-08 13:27 |只看该作者 |倒序浏览

  1. #include <stdio.h>

  2. void reverse(char *);
  3. main(){
  4.         char string[80];
  5.         printf("Enter a line of text (80) : ");
  6.         gets(string);

  7.         printf("\nReverse it : \n");
  8.         reverse(string);
  9. }

  10. void reverse(char *s){
  11.   if(s[0]=='\0'){
  12.     return;
  13.   }
  14.   else{
  15.     reverse(&s[1]);
  16.     putchar(s[0]);
  17.   }
  18. }
复制代码


程序会将一个字符传反转,但是在函数递归那块实在是看不明白,能帮忙详细讲解一下吗?

论坛徽章:
0
2 [报告]
发表于 2007-02-08 13:28 |只看该作者
逐字符向右移,遇 '\0' 终止

论坛徽章:
0
3 [报告]
发表于 2007-02-08 13:30 |只看该作者
是的,一直查找到字符串尾部
但是这个过程中,putchar函数似乎没有起到作用
不知道最终是怎么反转并打印出来的
能给一个简单的执行流程吗?谢谢

论坛徽章:
0
4 [报告]
发表于 2007-02-08 13:32 |只看该作者
--

s[0] 和 s[1] 的关系就是一个在左边,一个在右边。我说的逐字符向右移,就是这样

--

论坛徽章:
0
5 [报告]
发表于 2007-02-08 13:33 |只看该作者
也许是我表达的不清楚吧,我自己想想吧,谢谢斑竹

论坛徽章:
0
6 [报告]
发表于 2007-02-08 13:37 |只看该作者

更好的例子,反转一个u8的位

#include stdint.h
#include stdio.h

int main()
{
    uint8_t temp, temp2;
    int j;
    temp = 0x03, temp2 = 0;
    for( j=0; j<8; j++ )
    {
        temp2 = (temp2<<1);
        if( temp&0x01 )
            temp2 |= 0x01;
        temp = temp>>1;
    }
    printf("result = 0x%x\n",temp2);
    return 0;
}

论坛徽章:
0
7 [报告]
发表于 2007-02-08 13:45 |只看该作者
--

  1. void reverse(char *s){
  2.   if(s[0]=='\0'){
  3.     return;
  4.   }
  5.   else{
  6.     reverse(&s[1]);
  7.     putchar(s[0]);
  8.   }
  9. }
复制代码


假设有 buf[20],里面是:'1', '2', '3', '\0', 后面不用管了

那么,reverse(&buf[0]) 的执行过程基本是这样的:

reverse(&buf[0]);   ->   '1'

reverse(&buf[1]);   ->   '2'
  reverse(&buf[2]);   ->   '3'
    reverse(&buf[3]);
      遇零,返回   ->   '\0'
    putchar(buf[2]);   ->   '3'
  putchar(buf[1]);   ->   '2'
putchar(buf[0]);   ->   '1'

就回来了

--

论坛徽章:
0
8 [报告]
发表于 2007-02-08 13:46 |只看该作者
不停右移到字符串末尾
然后从最后一个字符开始打印一直打到字符串开始。
意思就是将你输入的字符串倒个。

典型的递归啊

论坛徽章:
0
9 [报告]
发表于 2007-02-08 13:53 |只看该作者
--

另外,

  1.   if(s[0]=='\0'){
  2.     return;
  3.   }
复制代码


返回到的是最后一次 reverse() 被调用的位置,即 putchar() 的地方,这样可以 putchar() 打出 '\0' 左边的那个字符,再返回。这个时候返回到上一次被调用的位置,然后再 putchar(),返回。再这样,一直继续到第二次被调用的位置,打出第一个字符,收工。

--

论坛徽章:
0
10 [报告]
发表于 2007-02-08 14:15 |只看该作者
反向输出输入字符串
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP