Когда пользователь моей программы нажимает неиспользуемый ключ, даже ключ, в котором отсутствует видимый глиф, я хочу сообщить что-то вроде «Предупреждение: игнорирование нажатия клавиш Ctrl + W». Это лучше, чем «игнорировать нажатие клавиш, у которых десятичное значение равно 23;
Итак, имеет ли C или C ++ любой неопределенно стандартный способ конвертировать целые числа в строки, что-то вроде этого?
65 -> "A"141 -> "a"32 -> "SPACE"3 -> "CTRL+c"26 -> "Ctrl+Z"
Через много десятилетий после падения EBCDIC копирование таблицы, такой как «man ascii», слишком смущает ( Ascii имя значения ).
Классическая проблема.
Сначала нам нужно отсортировать значения 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.
если вы хотите, чтобы в таблице ASCII было 65, приведите int к (char):
#include <iostream>
using namespace std;
int main()
{
int temp = 65;
cout << (char)temp << endl;
return 0;
}