c/c++ 缓冲输入和非缓冲输入

C语言有缓冲输入和非缓冲输入两种情况,默认缓冲输入,因为有的计算机不支持非缓冲输入。缓冲输入下,通过标准输入(键盘)输入的字符会先存在输入缓冲区里,同时会回显到屏幕上。这样就可以在输入回车(将输入缓冲区清空,并发送到程序的输入队列中,供程序使用)之前,进行输入的修改。但是也支持非缓冲输入,不需要输入回车来将输入发送给程序,而是键盘的任何输入都直接发送到程序的输入队列中。

简言之,缓冲输入的流程是:键盘-》输入缓冲区-》程序中的输入队列 非缓冲输入的流程是: 键盘-》程序中的输入队列

getche()和getch()这两个函数是用于非缓冲输入的,前者提供回显(记:多一个字母,多一个小功能),后者不提供回显。



C函数一般都有返回值,只是有时候不需要获取这个返回值罢了。

printf返回打印的字符的数目,有输出错误则返回负数。

scanf返回读入项目的个数,如果读入失败(比如想读入一个%d,但是用户却输入的'a')会返回0,这时候输入队列头指针不向后移,下次getchar或者scanf还是从刚才的位置开始;读到文件结尾返回EOF(一般在头文件中会有#define EOF -1)。



测试getche和getch的例子如下所示:(在c++中需要加上头文件 #include "conio.h")

#include "stdio.h"
int main(void)
{
int d;
char ch;
printf("Input a character:");
ch=getchar();
printf("\nYou input a '%c'\n", ch);
ch = getche();
printf("\nYou input a '%c'\n", ch);
ch=getch();
printf("\nYou input a '%c'\n", ch);

while((ch=getchar())!='\n')
{
putchar(ch);
}
getchar();
return 0;
}

输入:abcd[enter]jk

输出:a

j

k

bcd //说明输入队列不受getche和getch这些非缓冲函数的影响

以上原文转自:http://www.cnblogs.com/particle/archive/2012/11/02/2751430.html

利用 getche()和  getch()函数就可以对用户的单个输入做及时的响应

配合完成的ASCⅡ码表,就可以得知用户的输入

 ASCⅡ码表如下:

码值控制字符码值控制字符码值控制字符码值控制字符码值控制字符
0NUL32(space)64@96128Ç
1SOH3365A97a129ü
2STX3466B98b130é
3ETX35#67C99c131â
4EOT36$68D100d132ä
5ENQ37%69E101e133à
6ACK38&70F102f134å
7BEL39,71G103g135ç
8BS40(72H104h136ê
9HT41)73I105i137ë
10LF42*74J106j138è
11VT43+75K107k139ï
12FF44,76L108l140î
13CR45-77M109m141ì
14SO46.78N110n142Ä
15SI47/79O111o143Å
16DLE48080P112p144É
17DCI49181Q113q145æ
18DC250282R114r146Æ
19DC351383S115s147ô
20DC452484T116t148ö
21NAK53585U117u149ò
22SYN54686V118v150û
23TB55787W119w151ù
24CAN56888X120x152ÿ
25EM57989Y121y153Ö
26SUB58:90Z122z154Ü
27ESC59;91[123{155¢
28FS6092\124|156£
29GS61=93]125}157¥
30RS6294^126~158
31US63?95127DEL159

ƒ

码值控制字符码值控制字符码值控制字符
160á192224α
161í193225ß
162ó194226Γ
163ú195227π
164ñ196228Σ
165Ñ197229σ
166ª198230µ
167º199231τ
168¿200232Φ
169201233Θ
170¬202234Ω
171½203235δ
172¼204236
173¡205237φ
174«206238ε
175»207239
176?208240
177?209241±
178210242
179211243
180212Ô244
181213245
182214246÷
183215247
184216248
185217249
186218250·
187219251
188220252
189221253²
190222?254
191223?255ÿ





 

键盘常用ASCII码

ESC键 VK_ESCAPE (27)
回车键: VK_RETURN (13)
TAB键: VK_TAB (9)
Caps Lock键: VK_CAPITAL (20)
Shift键: VK_SHIFT ($10)
Ctrl键: VK_CONTROL (17)
Alt键: VK_MENU (18)
空格键: VK_SPACE ($20/32)
退格键: VK_BACK (8)
左徽标键: VK_LWIN (91)
右徽标键: VK_LWIN (92)
鼠标右键快捷键:VK_APPS (93)

Insert键: VK_INSERT (45)
Home键: VK_HOME (36)
Page Up: VK_PRIOR (33)
PageDown: VK_NEXT (34)
End键: VK_END (35)
Delete键: VK_DELETE (46)

方向键(←): VK_LEFT (37)
方向键(↑): VK_UP (38)
方向键(→): VK_RIGHT (39)
方向键(↓): VK_DOWN (40)

F1键: VK_F1 (112)
F2键: VK_F2 (113)
F3键: VK_F3 (114)
F4键: VK_F4 (115)
F5键: VK_F5 (116)
F6键: VK_F6 (117)
F7键: VK_F7 (118)
F8键: VK_F8 (119)
F9键: VK_F9 (120)
F10键: VK_F10 (121)
F11键: VK_F11 (122)
F12键: VK_F12 (123)

Num Lock键: VK_NUMLOCK (144)
小键盘0: VK_NUMPAD0 (96)
小键盘1: VK_NUMPAD0 (97)
小键盘2: VK_NUMPAD0 (98)
小键盘3: VK_NUMPAD0 (99)
小键盘4: VK_NUMPAD0 (100)
小键盘5: VK_NUMPAD0 (101)
小键盘6: VK_NUMPAD0 (102)
小键盘7: VK_NUMPAD0 (103)
小键盘8: VK_NUMPAD0 (104)
小键盘9: VK_NUMPAD0 (105)
小键盘.: VK_DECIMAL (110)
小键盘*: VK_MULTIPLY (106)
小键盘+: VK_MULTIPLY (107)
小键盘-: VK_SUBTRACT (109)
小键盘/: VK_DIVIDE (111)

Pause Break键: VK_PAUSE (19)
Scroll Lock键: VK_SCROLL (145)

有人会尝试 char ch = getche();

int number = ch;

cout<<ch<<endl;

之类的代码来测试上述键盘常用ASCII码的数值,或者都不尝试就用了,请各位注意的是,我自己尝试后发现了上述的错误,这样的程序输出的数值并不是上面所提到的,多方查询资料后得知键盘ASCII码和字符ASCII码是不同的,C和C++语言中使用的是字符ASCII码,而在js和as中才使用的是上述的键盘ASCII码。

在C和C++语言中普通键盘的编码是用的字符码采用的是ASCII码,而特殊键采用的是扫描码,关于键盘扫描码的介绍请看:

键盘扫描码介绍
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值