A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiangenhao 中级黑马   /  2014-4-26 00:21  /  1353 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 jiangenhao 于 2014-4-26 21:54 编辑
  1. 将八进制正整数字符串转换为十进制整数。
  2. #include "stdio.h"
  3. #include "string.h"
  4.     main()
  5.     {
  6.         char *t, s[8];
  7.         int n;
  8.         t=s;
  9.         gets(t);
  10.         n= *t-'0';
  11.         while (*(++t)!= '\0') n=n*8+*t-'0';
  12.         printf("%d\n", n);
  13.     }
复制代码

  while (*(++t)!= '\0') n=n*8+*t-'0';
这一句是什么意思没有看懂

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 peku 于 2014-4-26 09:22 编辑

这句话的执行顺序是++t-->判断*t是不是!='\0'作为循环条件--->如果是执行赋值运算n=n*8+*t-'0'
第一步:因为t是一个指向s[8]指针变量,所以++t表示将t指针向后移动一个t所属类型的字节数,在这里就是char类型的字节数,也就是指向了数组的下一个元素。
第二步:因为C语言字符串或者字符数组中最后一个字符默认为\0表示字符串的结束,所以以第二步来判断是否遍历完数组中的字符。
第三步:这个估计你比较难理解,(n=*t-'0')这句话表示将t指向的s[8]的元素从字符形式转换成数字形式,因为字符数组s[8]中存放的只是每一个位的数字的字符,而且s[0]代表的是最高位,依次类推s[1]代表次高位。比如一个1234的8进制,最终计算可以这样表示,((1*8+2)*8+3)*8+4,这个和程序里面的计算过程是一样的,每一个括号代表一步,也就是一次循环。这个计算过程通用于其他进制,比如10进制的数2389,(2*10+3)*10+8)*10+9=2389.

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
  1.     while (*(++t)!= '\0') n=n*8+*t-'0';
  2.     // 首先执行 指针t+1,然后取出t+1指向的字符判断是否等于字符串结束字符 '\0'
  3.     // 如果不等于'\0',那么执行n=n*8+*t-'0'
  4.     // 如果等于'\0'则结束这个while循环
  5.     // 再说下这个wihle循环的算法
  6.     // 例如:字符串是 "1422"
  7.     //  n= *t-'0'; // *t 就是 ‘1’,'1' - '0' = 1;
  8.     // 进入循环语句 while (*(++t)!= '\0') n=n*8+*t-'0';
  9.     // n = 1 * 8 + '4' - '0'; // n = 12
  10.     // n = 12 * 8 + '2' - '0'; // n = 98
  11.     // n = 96 *8 + '2' - '0'; // n = 786
  12.     // while循环结束。
复制代码

点评

猴哥很厉害呀  发表于 2014-4-26 12:50

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
(*(++t)!= '\0')是判断输入的八进制字符串有没有到头,字符串存放以‘\0‘作为结束符由于字符以ASC码存放t-’0‘就转换成相应整数,以1234为例八进制转十进制过程如下:初始n为0,t为1,随着while循环n的计算过程如下
0*8+1  1*8+2  10*8+3 83*8+4 即得出结果
回复 使用道具 举报
本帖最后由 m573555543 于 2014-4-26 20:35 编辑

while (*(++t)!= '\0') n=n*8+*t-'0';

第一 :   先运行  (++t)
第二:  指针 t+1 不等于 \0  ,   也就是不能等于字符串结束
第三:  n=n*8+*t-'0' 最好加上 大括号{   }

n= s[0]*8+s[1]-'0';
n= s[1]*8+s[2]-'0';
n= s[2]*8+s[3]-'0';
……

回复 使用道具 举报
看明白了 谢谢各位 你们都这么厉害啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马