由控制台EOF想到

看书中,有实现键盘输入,然后打印出输入字符

环境: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;
}

那么,回到第一段代码,通过比较可以看到,对于'^Z',出现在不同的位置,输入设备读到的返回值是不一样的。当'^Z'出现在行首时,读到的就是-1(一般EOF值在stdio.h中定义为-1),同时,丢弃该行后续输入内容;当'^Z'出现在行中,读到的是它的ASCII值26,同时也会丢弃该行后续输入内容。

事实上,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中的非阻塞式没试过。

等以后学会怎么监控键盘缓冲区了再具体看看以上不同字符输入的实现过程。


由控制台EOF想到_第1张图片

由控制台EOF想到_第2张图片

参考:

进一步理解ASCII码;

标准输入与Ctrl+D/Ctrl+Z;

你可能感兴趣的:(疑难随想)