Prettyprint ASCII значения для нажатия клавиш в C / C ++

0

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

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

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

На протяжении многих десятилетий после сокращения EBCDIC копирование таблицы, такой как "человек ascii", слишком смущает (имя ценности Ascii).

  • 0
    Ваша программа читает эти нажатия клавиш нестандартным способом. Используйте преобразования этой системы.
  • 0
    Он читает нажатия клавиш с помощью обратного вызова GLUT. Виноват глют.
Показать ещё 1 комментарий
Теги:
ascii
keystroke

2 ответа

1
Лучший ответ

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

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

  • 0
    За исключением несоответствий скобок и тестирования на 32, это ловит все, что может прочитать обратный вызов клавиатуры GLUT с клавиатуры США с 101 клавишей. Достаточно хорошо!
  • 0
    @Camille Goudeseune Фиксированные брекеты. if (isgrpah(ch)) и проверка на наличие space в порядке. Похоже, вы хорошо знаете, как его адаптировать. Кстати: нет стандартной функции isascii() . Вся эта проблема становится сложной, если нам нужна высокая мобильность, особенно если мы пытаемся работать в среде без ASCII C и / или на клавиатуре.
Показать ещё 1 комментарий
0

если вы хотите "A", который равен 65 в таблице ASCII, введите int (char):

#include <iostream>

using namespace std;

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

   return 0;
}
  • 2
    Что если OP хочет «пробел»?
  • 0
    Как указывалось в другом ответе, это можно было бы использовать с поиском, хотя на работе так и не прочитали вопрос полностью.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню