是否有没有ASCII值的密钥

时间:2014-01-23 04:44:43

标签: c ascii turbo-c++ getch

当我按下“ F1 - F12, Delete, Caps Lock, Num Lock

键时,为什么程序不返回ASCII值
#include<stdio.h>

int main()
{
char a;
clrscr();
a= getche();

printf("\n a= %c ASCII = %d ASCII = %hhu",a,a,a);
// used hhu as it was told in SO it helps to print ASCII

getch();
return 0;
}

它返回值0。为什么会这样?在按下Num Lock和Caps Lock时,它不会采取任何措施。 (注意:我没有测试所有键) 如果有任何错误,请更正程序。我用Turbo c ++编写程序。

谢谢

3 个答案:

答案 0 :(得分:4)

ASCII是一种字符编码方案,最初基于英文字母,编码128个指定字符。所以是的,许多键盘中有很多键没有ASCII码。

您所指的是更接近scancode。某些键(例如功能键)具有不具有可打印表示的扫描码,即。代码不属于[0-127]。解释功能键的方式在很大程度上取决于您的环境,例如您的终端仿真器是否在VT100模式下运行。

答案 1 :(得分:2)

密钥会发生什么情况取决于您的终端类型/操作系统。一般情况如下:

键盘      - &GT;某种中断挂钩(操作系统的一部分)      - &GT;将键击更改为ASCII字符      - &GT;将结果提供给您的计划。

例如,'A'的ASCII字符为65'a'的ASCII字符为97。但是,键盘上的物理键是相同的。 ASCII字符是操作系统解释按下的序列/组键的方式的结果。

要访问按下的键,您必须进行一些低级编程。不用说,这将是特定于操作系统的。

答案 2 :(得分:2)

这实际上取决于您的标准库(很可能来自您的编译器)。因此,您将获得从OS到OS以及编译器到编译器的所有内容。

您的标准lib将OS调用读取密钥。然后,它将从OS返回的值转换为从C stdin返回的值。有些映射像A-Z一样简单,但其他像F1-F12,页面向上/向下和ALT-Keys则没有。

大多数人都同意一些事情:

  • A-Z映射到ASCII 65-90
  • a-z映射到ASCII 97-122
  • 0-9映射到ASCII 48-57
  • 标准标点符号映射到存在的ASCII(。,“!etc)
  • 将A-Z地图控制为ASCII控制代码1-26
  • 将地图返回/输入ASCII 13
  • ESC映射到ASCII 27
  • TAB映射到ASCII 9

大多数时候他们也同意这些:

  • 退格键映射到ASCII 8
  • 删除地图为ASCII 127

这就是为什么你有时会得到某些键的值而不是所有键的值。

基于你的函数调用getche()和你的标签turboc ++,我怀疑你正在使用Turbo C ++。 Turbo C ++使用旧的DOS方法(就像GWBasic和DOS时代的许多其他程序一样)。

在DOS方法中,你会得到一个0,然后是第二个按下键的字符。所以你会读取stdin,如果它再次读取stdin为0,然后将该代码作为在switch语句中按下的键处理。

例如,左箭头是“\ 0”,后跟“K”。

以下是使用DOS方法的一些常用密钥。

a=getche();
if(a==0)
{
   a=getche();
   switch(a)
   {
      case 'H': printf("Up arrow\n");break;
      case 'P': printf("Down arrow\n";break;
      case 'K': printf("Left arrow\n";break;
      case 'M': printf("Right arrow\n";break;
      case ';': printf("F1\n";break;
      case '<': printf("F2\n";break;
      case '=': printf("F3\n";break;
      case '>': printf("F4\n";break;
      case '?': printf("F5\n";break;
      case '@': printf("F6\n";break;
      case 'A': printf("F7\n";break;
      case 'B': printf("F8\n";break;
      case 'C': printf("F9\n";break;
      case 'D': printf("F10\n";break;
      case 133: printf("F11\n";break;
      case 134: printf("F12\n";break;
      case 'R': printf("Ins\n";break;
      case 'S': printf("Del\n";break;
      case 'G': printf("Home\n";break;
      case 'O': printf("End\n";break;
      case 'I': printf("PgUp\n";break;
      case 'Q': printf("PgDn\n";break;
      default:
         printf("Unknown\n");
   }
}