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