【控制台IO】特殊按键

由于博主本身技术水平限制,文章中的问题漏洞还请批评指出

1.特殊字符特殊在哪

在控制台应用程序中,无法直接用scanf()等读取Esc,ctrl-C等按键,因为系统认为这是一个特殊的字符。下面进行解释。先研究ASCII表。

ASCII表

ASCII表
着重关注左半面,即0x00~0x1F。
第一列是十进制;
第二列是显示出来的字符(但在实测中发现并不完全准确);
第三列可能看不懂,着重关注。拿0x01为例,可以在cmd中进行检验。0x01的第三列是^A。与Ctrl-C的按键方式相似,在cmd中按住Ctrl,不放再摁A,就可以发现屏幕中出现了^A

cmd实测

2.如何实现文字的复制粘贴

在标题栏右击,在菜单中选择。见插图。

复制粘贴的实现

3.特殊按键的读取方法

根据上文的论述,只要能读取特殊按键所对应的数值就可以了。下面是获取对应数值的代码。
注意:有些按键组合会与系统快捷键冲突。
代码之后有对代码的解释。

#include<stdio.h>
#include <conio.h>
int main()
{
   	
	unsigned char c1,c2;
	//某些会返回负数,unsigned修饰后下溢为正数
	while(1)
	{
   
		c1=getch();
		c2=getch();
		printf("%02X\t",c1);
		printf("%02X\n",c2);
		printf("\n");
	}
	return 0;
}

getch()是<conio.h>中的一个函数。获取键盘上输入的一个字符,不显示在屏幕中。在特殊字符中,一个char有时候不能表达这么多种按键情况,所以要两个char
特殊字符与对应数值的关系主要依靠穷举。下面的代码用了switch-case来实现。当然可以把代码中的printf()语句根据实际需要更改。因为某些原因,该代码并没有枚举全部情况。
注意:有时候可能多个特殊按键对应同一个数值

//此代码可以读取特殊按键,包括方向键,Del,Esc等
#include <stdio.h>
#include <conio.h>
int main()
{
   
	unsigned char c;
	while(1)
	{
   
		fflush(stdin);
		c=getch();
		switch(c)
		{
   
		case 0x00:
			c=getch();
			switch(c)
			{
   
				case 0x03:printf("Ctrl+2");break;
				case 0x10:printf("Ctrl+Alt+Q");break;
				case 0x11:printf("Ctrl+Alt+W");break;
				case 0x12:printf("Ctrl+Alt+E");break;
				case 0x13:printf("Ctrl+Alt+R");break;
				case 0x14:printf("Ctrl+Alt+T");break;
				case 0x15:printf("Ctrl+Alt+Y");break;
				case 0x16:printf("Ctrl+Alt+U");break;
				case 0x17:printf("Ctrl+Alt+I");break;
				case 0x18:printf("Ctrl+Alt+O");break;
				case 0x19:printf("Ctrl+Alt+P");break;
				case 0x1A:printf("Ctrl+Alt+[");break;
				case 0x1B:printf("Ctrl+Alt+]");break;
				case 0x1C:printf("Ctrl+Alt+Enter");break;
				case 0x1E:printf("Ctrl+Alt+A");break;
				case 0x1F:printf("Ctrl+Alt+S");break;
				case 0x20:printf("Ctrl+Alt+D");break;
				case 0x21:printf("Ctrl+Alt+F");break;
				case 0x22:printf("Ctrl+Alt+G");break;
				case 0x23:printf("Ctrl+Alt+H");break;
				case 0x24:printf("Ctrl+Alt+J");break;
				case 0x25:printf("Ctrl+Alt+K");break;
				case 0x26:printf("Ctrl+Alt+L");break;
				case 0x27:printf("Ctrl+Alt+;");break;
				case 0x28:printf("Ctrl+Alt+'");break;
				case 0x2C:printf("Ctrl+Alt+Z");break;
				case 0x2D:printf("Ctrl+Alt+X");break;
				case 0x2E:printf("Ctrl+Alt+C");break;
				case 0x2F:printf("Ctrl+Alt+V");break;
				case 0x30:printf
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值