黑马程序员技术交流社区
标题:
八进制转换成十进制的问题
[打印本页]
作者:
jiangenhao
时间:
2014-4-26 00:21
标题:
八进制转换成十进制的问题
本帖最后由 jiangenhao 于 2014-4-26 21:54 编辑
将八进制正整数字符串转换为十进制整数。
#include "stdio.h"
#include "string.h"
main()
{
char *t, s[8];
int n;
t=s;
gets(t);
n= *t-'0';
while (*(++t)!= '\0') n=n*8+*t-'0';
printf("%d\n", n);
}
复制代码
while (*(++t)!= '\0') n=n*8+*t-'0';
这一句是什么意思没有看懂
作者:
peku
时间:
2014-4-26 08:39
本帖最后由 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.
作者:
脸皮猴
时间:
2014-4-26 09:08
while (*(++t)!= '\0') n=n*8+*t-'0';
// 首先执行 指针t+1,然后取出t+1指向的字符判断是否等于字符串结束字符 '\0'
// 如果不等于'\0',那么执行n=n*8+*t-'0'
// 如果等于'\0'则结束这个while循环
// 再说下这个wihle循环的算法
// 例如:字符串是 "1422"
// n= *t-'0'; // *t 就是 ‘1’,'1' - '0' = 1;
// 进入循环语句 while (*(++t)!= '\0') n=n*8+*t-'0';
// n = 1 * 8 + '4' - '0'; // n = 12
// n = 12 * 8 + '2' - '0'; // n = 98
// n = 96 *8 + '2' - '0'; // n = 786
// while循环结束。
复制代码
作者:
恣意
时间:
2014-4-26 12:40
(*(++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:32
本帖最后由 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';
……
作者:
jiangenhao
时间:
2014-4-26 21:53
看明白了 谢谢各位 你们都这么厉害啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2