由控制台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中的非阻塞式没试过。

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




参考:

进一步理解ASCII码

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值