Prettyprint ascii значения для нажатий клавиш в C / Stack Overflow

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

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

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

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

0

Решение

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

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

1

Другие решения

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

#include <iostream>

using namespace std;

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

return 0;
}
0

По вопросам рекламы [email protected]