最近做
《
C
P
r
i
m
e
r
P
l
u
s
》
《C Primer Plus》
《CPrimerPlus》第七章课后题,其中的第二题给了我一点启发。
题目是这样的:
7 - 2
编写一个程序读取输入读到 # 字符为止,程序要打印每个输入的字符以及对应的
A
S
C
I
I
ASCII
ASCII 码(十进制),每行打印 8 个字符 -
A
S
C
I
I
ASCII
ASCII 码 组合。建议:使用字符计数和求模运算符(%)在每八个循环周期时打印一个换行符。
输出形式如下:
我最先给出的代码为:
#include <stdio.h>
int main(void)
{
char ch;
int cnt=0;
while((ch = getchar())!= '#')
{
cnt++;
printf("'%c'-%3d. ",ch,ch);
if(cnt%8==0){
printf("\n");
}
}
printf("Done");
return 0;
}
认为没有问题,但是系统报错了。
因为字符不止我原先认为的数字、大小写字母等,还有一类特殊的字符,如 ‘\n’、 ‘\t’ 等。他们在程序中不会显示出来,而是起一定的作用,如换行,占位等,而不在程序中显示出来。因此,代码应该修改如下:
#include <stdio.h>
int main(void)
{
char ch;
int counter = 0;
while((ch = getchar()) != '#')
{
if(counter++%8 == 0)
printf("\n");
/* 使用计数器,每八个字符打印一个换行符。注意:
* 本行代码在counter为 0 时会首先打印一个换行符。
* */
if(ch == '\n')
printf("'\\n'-%03d. ",ch);
/* 标准输入的换行符需要转换显示方式,否则会可能会在
* 不足八个字符时就产生产生换行。
* */
else if(ch == '\t')
printf("'\\t'-%03d. ",ch);
/* 标准输入的制表符需要转换显示方式 * */
else printf("'%c'-%03d. ",ch,ch);
/* 其他字符通过打印原字符和十进制数 */
}
printf("Done\n");
return 0;
}
程序增添了对 ‘\n’、 ‘\t’ 字符的判断。
这虽然只是一个小细节,但是不加以纠正,可能会铸成大错,写一篇博客以警示自己。