Значения ascii Prettyprint для нажатий клавиш в C/C++

Когда пользователь моей программы нажимает неиспользуемую клавишу, даже клавишу, в которой отсутствует видимый глиф, я хочу сообщить что-то вроде «Предупреждение: игнорирование нажатия клавиш Ctrl+W». Это лучше, чем «игнорировать нажатие клавиши, десятичное значение которого равно 23; погуглите сами, придурок».

Итак, есть ли в C или C++ какой-либо неопределенно стандартный способ преобразования целых чисел в строки, что-то вроде этого?

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

Спустя много десятилетий после упадка EBCDIC копирование таблицы, такой как «man ascii», слишком смущает ( Ascii имя значения ).


person Camille Goudeseune    schedule 19.11.2013    source источник
comment
Ваша программа считывает эти нажатия клавиш нестандартным способом. Используйте преобразования этой системы.   -  person chris    schedule 19.11.2013
comment
Он читает нажатия клавиш с обратным вызовом GLUT. Виноват ГЛЮТ.   -  person Camille Goudeseune    schedule 19.11.2013
comment
1-26 — это просто Ctrl+A — Ctrl-Z, это просто.   -  person MSalters    schedule 20.11.2013


Ответы (2)


Классическая проблема.

Сначала нам нужно разобраться в значениях ASCII и нажатиях клавиш. ASCII — это кодировка символов со значениями от 0 до 127. «Коды» нажатий клавиш различаются, но обычно сопоставляются с ASCII, когда они доступны (Shift + A создает код ASCII 97) и с другими кодами. или действия для других клавиш, таких как 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() верно для кодов ASCII от 32 до 126.
isgraph() верно для тех же кодов, что и isprint() ожидается код 32 (пробел).
Этот ответ проблематичен в средах, отличных от ASCII.

person chux - Reinstate Monica    schedule 19.11.2013
comment
За исключением несоответствия фигурных скобок и проверки на 32, это улавливает все, что обратный вызов клавиатуры GLUT может прочитать с клавиатуры со 101 клавишей в США. Достаточно хорошо! - person Camille Goudeseune; 20.11.2013
comment
@Camille Goudeseune Фиксированные брекеты. if (isgrpah(ch)) и тест на space в порядке. Хотя, похоже, вы хорошо знаете, как его адаптировать. Кстати: стандартной функции C isascii() не существует. Вся эта проблема становится сложной, если нам нужна высокая переносимость, особенно при попытке работать в среде C, отличной от ASCII, и/или на клавиатуре. - person chux - Reinstate Monica; 20.11.2013
comment
Да, сильно обобщать это так же сложно, как построить мост, достаточно прочный, чтобы нести бесконечно тяжелый грузовик ... то, что работает большую часть времени, здесь достаточно хорошо. - person Camille Goudeseune; 20.11.2013

если вы хотите, чтобы «A», равное 65 в таблице ASCII, было приведено к (char):

#include <iostream>

using namespace std;

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

   return 0;
}
person NotMikeDean    schedule 19.11.2013
comment
Что, если OP хочет места? - person P0W; 19.11.2013
comment
Как говорилось в другом ответе, это можно было бы использовать с поиском, хотя на работе я не читал вопрос полностью. - person NotMikeDean; 19.11.2013