看书中,有实现键盘输入,然后打印出输入字符
环境:win7-64,C-Free,mingw5,C
#include
int main()
{
int c;
while ((c = getchar())!=EOF)
putchar(c);
return 0;
}
查得在控制台文件结束符 EOF 是通过 Ctrl+z来输入(Linux为Ctrl+d),控制台显示'^Z',运行后,发现个有意思的东西。
从控制台进行几种不同的输入,得到不同的输出:('\n'为通过回车键输入,'^Z'为Ctrl+z)
1. 输入:'ab\n' 输出:'ab\n'
2. 输入:'ab^Z\n' 输出:'ab→' (注意末尾无换行)
3. 输入:'ab^Zc\n' 输出:'ab→' (注意末尾无换行)
4. 输入:'^Z ' 输出:程序结束
5. 输入:'^Zab' 输出:程序结束
标准输入设备,是进行行缓冲的,当在控制台按下回车键,输入的字符串会被送到缓存区(包括'\n'),输入函数再从缓冲区按顺序读取。此点通过以下代码分别输入'a\n\n','ab\n','abcd\n‘,进行验证。
#include
int main()
{
char ch = getchar();
char ch2 = getchar();
char ch3 = getchar();
printf("You put char is %d\n",ch);
printf("You put char is %d\n",ch2);
printf("You put char is %d\n",ch3);
return 0;
}
事实上,ASCII的前32个非打印控制字符,都可以通过'Ctrl+*'实现,亦即是说在键盘上没有相应按键时,可以通过"Ctrl+*'来实现相应功能。如"Ctrl+H"表示退格,'Ctrl+M'表示回车等,也可以通过读入'Ctrl+*'后输出相应字符,其数值为Ctrl后接的 '*'的ASCII码&0x1f,如'Ctrl+Z'的即为26,详见ASCII表。'Ctrl+J'、'Ctrl+C'、’Ctrl+S‘貌似作了特殊处理,控制台输入输出模式还挺多的,以后学多点了再研究。
另外,作为结束符的'Ctrl+Z'、'Ctrl+D',检查方式有两种:非阻塞式(实时响应)和阻塞式(回车后检测)。Windows的为阻塞式,所以在第一段代码中能有第2/3/5种输入,即输入'Ctrl+Z'后还能输入其他内容;Linux中的非阻塞式没试过。
等以后学会怎么监控键盘缓冲区了再具体看看以上不同字符输入的实现过程。
参考: