研究这个问题的根源是一道练习题:
编写一个将输入复制到输出的程序,并将其中的制表符替换为\t,把回退符替换为\b,把反斜杠替换为\。这样制表符和回退符可以用可见的方式显示出来。
第一眼看到这个问题,觉得很简单嘛,不就是getchar()获取一个字符,然后putchar()输出么,中间判断一下是不是制表符、回退和反斜杠就行了,就像这样:
void dispsymbo()
{
int c;
while((c=getchar())!=EOF){
if(c=='\t')
printf("\\t");
else if(c=='\b')
printf("\\b");
else if(c=='\\')
printf("\\\\");
else
putchar(c);
}
}
运行后就发现问题了:回退怎么显示?根据上一个博客,getchar()是回车触发的,触发前我的回退早就发生作用了,所以回退是不能通过getchar正确获得的!
到网上搜了一下,发现一个比较有意义的讨论http://bbs.bccn.net/thread-415188-1-1.html(TonyDeng大大好霸气!)
遂在MSDN上查了_getch()和_getche()的用法,这两个用法比标准库中的getchar()更加底层,直接获取键盘输入的字符,相当于是键盘的按键中断触发的,而不是回车触发的。据此修改了程序:
void p1_10_dispsymbo()
{
int c;
c = _getch();
while (c != 'q')
{
if (c == '\t')
{
_putch('\t');
_putch('\\');
_putch('t');
}
else if (c == '\b')
{
_putch('\b');
_putch('\\');
_putch('b');
}
else if (c == '\\')
{
_putch('\\');
_putch('\\');
}
else if (c == '\r')
{
_putch('\r');
_putch('\n');
}
else
{
_putch(c);
}
c = _getch();
}
}
运行结果如下:
这里还有一些问题:
1.不能实现整行输入后再输出,不直观。后续可以用字符数组实现。
2.不能捕获EOF!Ctrl+Z也不行!还得继续研究一下。