由于博主本身技术水平限制,文章中的问题漏洞还请批评指出
1.特殊字符特殊在哪
在控制台应用程序中,无法直接用scanf()等读取Esc,ctrl-C等按键,因为系统认为这是一个特殊的字符。下面进行解释。先研究ASCII表。
ASCII表
着重关注左半面,即0x00~0x1F。
第一列是十进制;
第二列是显示出来的字符(但在实测中发现并不完全准确);
第三列可能看不懂,着重关注。拿0x01为例,可以在cmd中进行检验。0x01的第三列是^A。与Ctrl-C的按键方式相似,在cmd中按住Ctrl,不放再摁A,就可以发现屏幕中出现了^A
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