1

为什么当我按下“ 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++ 编写程序。

谢谢你

4

3 回答 3

4

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

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

于 2014-01-23T05:38:30.627 回答
2

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

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

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

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

于 2014-01-23T06:05:07.590 回答
2

这实际上取决于您的标准库(很可能来自您的编译器)。因此,从操作系统到操作系统,从编译器到编译器,您将得到的东西非常多。

您的标准库需要操作系统调用来读取密钥。然后它将从操作系统返回的值转换为从 C 标准输入返回的值。有些映射像 AZ 一样简单,但其他的像 F1-F12、向上/向下翻页和 ALT 键则不是。

大多数人都同意以下几点:

  • AZ 映射到 ASCII 65-90
  • az 映射到 ASCII 97-122
  • 0-9 映射到 ASCII 48-57
  • 标准标点符号映射到它们存在的 ASCII (.,"! 等)
  • 控制 AZ 映射到 ASCII 控制代码 1-26
  • Return/Enter 映射到 ASCII 13
  • ESC 映射到 ASCII 27
  • TAB 映射到 ASCII 9

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

  • 退格映射到 ASCII 8
  • 删除映射到 ASCII 127

这就是为什么您有时会为某些键而不是所有键获得值的原因。

根据您的函数调用 getche() 和标签 turboc++,我怀疑您使用的是 Turbo C++。Turbo C++ 使用旧的 DOS 方法(正如 GWBasic 和 DOS 时代的许多其他程序一样)。

在 DOS 方法中,您将得到一个 0,后跟第二个字符,即按下的键。因此,您将读取标准输入,如果它是 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");
   }
}
于 2014-01-23T15:27:02.300 回答