【问题标题】:Prettyprint ascii values for keystrokes in C/C++Prettyprint ascii 值用于 C/C++ 中的击键
【发布时间】:2013-11-19 17:04:53
【问题描述】:

当我的程序的用户点击一个未使用的键,甚至是一个缺少可见字形的键时,我想报告类似“警告:忽略击键 Ctrl+W”的内容。这比“忽略十进制值为 23 的击键;自己去谷歌搜索,笨蛋”更友好。

那么,C 或 C++ 是否有任何模糊标准的方法来将整数转换为字符串,比如这样?

65 -> "A"
141 -> "a"
32 -> "SPACE"
3 -> "CTRL+c"
26 -> "Ctrl+Z"

在 EBCDIC 衰落这么多年后,复制粘贴“man ascii”之类的表格实在是太尴尬了 (Ascii name of value)。

【问题讨论】:

  • 您的程序正在以非标准方式读取这些击键。使用该系统的转化。
  • 它正在读取带有 GLUT 回调的击键。责备过剩。
  • 1-26 就是 Ctrl+A - Ctrl-Z,很简单。

标签: c++ c ascii keystroke


【解决方案1】:

一个经典的问题。

首先,我们需要区分 ASCII 值与击键。 ASCII 是值 0 到 127 的字符编码。击键“代码”各不相同,但通常在可用时映射到 ASCII(Shift + A 使 ASCII 代码为 97)和其他代码或 other 键(如 F1右箭头 等)的操作。通常,键盘有超过 256 种可能的击键组合。此外,某些键盘界面可能会直接生成超过一百万个代码的 Unicode。

char 通常是 8 位(256 个代码),通常将 0 到 127 编码为 ASCII,其余的代码非常依赖于系统。 isprint()isgraph() 可用于整理“可视字形”要求。之后可能需要推出您自己的代码。

// Sample handler
int keystroke = OP_GetKeystroke();  // fictitious system dependent function
if (OP_IsChar(keystroke)) {
  char ch = keystroke;
  if (isascii(ch)) {
    if (isprint(ch)) {
      printf("%c", ch);
    }
    else if (ch < ' ') {
      printf("<Ctrl-%c>", ch+'@');
    }
    else {
      printf("<DEL>");
    }
  }
  else { 
    printf("<\x%02X>", ch & 0xFF);  // char codes outside ASCII range 
  }
}
else {
  printf("<Key: %X>", keystroke);  // keystroke outside char range 
  }

isprint() true 表示 ASCII 代码 32 到 126。
isgraph() true 表示与 isprint() 相同的代码,期望代码 32(空格)。
这个答案在非 ASCII 环境中是有问题的。

【讨论】:

  • 除了大括号不匹配和对 32 的测试之外,这会捕获 GLUT 键盘回调可以从美国 101 键键盘读取的任何内容。够好!
  • @Camille Goudeseune 固定牙套。 if (isgrpah(ch))space 的测试按顺序进行。听起来你很清楚如何适应它。顺便说一句:没有标准的 C isascii() 函数。如果我们想要高可移植性,尤其是尝试在非 ASCII C 环境和/或键盘中工作,那么整个问题就会变得具有挑战性。
  • 是的,将其概括起来就像建造一座足以承载无限重卡车的桥梁一样棘手......“大部分时间”工作的东西在这里就足够了。
【解决方案2】:

如果您想要 ASCII 表中的 65 的“A”转换为 (char):

#include <iostream>

using namespace std;

int main()
{
   int temp = 65;
   cout << (char)temp << endl; 

   return 0;
}

【讨论】:

  • 如果 OP 想要“空间”怎么办?
  • 正如另一个答案所述,这可能与查找一起使用,虽然在工作中所以没有彻底阅读这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2013-07-04
  • 1970-01-01
相关资源
最近更新 更多