3. 读入一个字符串,并把它当作 8 进制数字,计算出对应的十进制数值后,输出
没有进行字符检测,因此,输入 非数字 内容,或者 8, 9 都会当作“0-7" 数字处理
gets (s); // 读入字串
if ( s [ 0 ] != ‘\0' ) n = s [ 0 ] - '0'; // 如果第一位非 0 即字串非空,n 赋值为第一位字符转换的数值
// 其中 s[0] = '0' 是 ASCII 编码下,把字符 '0' - '9' 变成对应的数值 0-9 的技巧
// 但是这是个很糟糕的语句,因为你不能保证你的字符一定是 ASCII 编码
// 正确的方式是引用 atoi () 函数,它往往实现为 inline 方式,等价于上面的语句,但移植性很好
// 另外,这句 if 根本不需要, 只要本行赋值 n = 0, 并在下一行赋值 j = 0,整个程序的流程是一样的
// 可见出题者可能不太理解 while 语句
while 语句: 从 j=1 依次判断 s[j] 是否为 '0', 即字符串是否到头,如是,跳出循环;如否,
n = n*8 + s[j-1] - '0', 把 n * 8 再加上 s[j] 转换的数值
// 这里的知识点:j++ 是后加过程,s[j++] 引用后(此时为 j 原值), j 自增 1
// 依然有问题:语句不简洁且效率低,应该是
// while ( s[j] ) n = n*8 + s [j++] - '0';
// 这样少做一次减法,当然,最好的写法:
// while ( s[j] ) n = (n<<3) + atoi ( s [ j++] ); // 这里利用左移三位替代 *8, 移位要快于乘法
// 最后,while 语句条件缺乏保护,应该判断 (j < 6) 的, 否则如果 gets 的时候你输多了,循环就失去了终止条件;
printf 语句是输出对应的十进制数值
4. 这次,是把一个字串数组,按十进制转换为数值. 虽然他用了 for 循环,但过程和上题是类似的
但他把第一个字串计算出来后,直接进入了 i = 1 也就是第二个字串的转换(注意,c 里面数组引用从 0 开始),所以,会 printf 出来两个字串拼起来的数值,即 69378254
同样,我们在实际写程序的时候,良好的习惯是记得用 atoi (), 不要用 ch [i][i] - '0'
n = n * 8 + s[j - 1] - '0'; 字符型和整型可以在一起运算吗?
第二个输出字符串69378254