Слишком много лет назад, когда я проводил свое время на языках ассемблера для 8-битных микросхем, я написал бы что-то вроде
printf("%3.3s",
("NULSOHSTXETXEOTENQACKBELBS HT LF VT FF CR SO SI "
"DLEDC1DC2DC3DC4NAKSYNETBCANEM SUBESCFS GS RS US ")[3*ch]);
, но не потому, что это особенно лучше.И умножение на три раздражает, потому что 8-битные микро не умножаются, так что это потребовало бы как сдвига, так и добавления, а также запасного регистра.
Намного более C-подобный результат будетиспользовать таблицу с четырьмя байтами на элемент управления, включая байты NUL.Это позволяет указывать каждую запись как строковую константу, но экономит дополнительное хранилище для 32 указателей.
const char *charname(int ch) {
if (ch >= 0 && ch <= 0x20)
return ("NUL\0" "SOH\0" "STX\0" "ETX\0" /* 00..03 */
"EOT\0" "ENQ\0" "ACK\0" "BEL\0" /* 04..07 */
"BS\0\0" "HT\0\0" "LF\0\0" "VT\0\0" /* 08..0B */
"FF\0\0" "CR\0\0" "SO\0\0" "SI\0\0" /* 0C..0F */
"DLE\0" "DC1\0" "DC2\0" "DC3\0" /* 10..13 */
"DC4\0" "NAK\0" "SYN\0" "ETB\0" /* 14..17 */
"CAN\0" "EM\0\0" "SUB\0" "ESC\0" /* 18..1B */
"FS\0\0" "GS\0\0" "RS\0\0" "US\0\0" /* 1C..1F */
"SP\0\0") + (ch<<2); /* 20 */
if (ch == 0x7f)
return "DEL";
if (ch == EOF)
return "EOF";
return NULL;
}
Я попытался отформатировать основную таблицу, чтобы ее организация была понятной.Функция возвращает NULL для символов, которые называют себя или не являются 7-битными ASCII.В противном случае он возвращает указатель на ASCII-строку, оканчивающуюся NUL, содержащую условное сокращение этого управляющего символа, или «EOF» для не-символа EOF
, возвращаемого стандартными процедурами ввода-вывода C в конце файла.* Обратите внимание на усилия, приложенные для заполнения каждого слота имени персонажа ровно четырьмя байтами.Это тот случай, когда создание этой таблицы с использованием языка сценариев или отдельной программы было бы хорошей идеей.В этом случае простой ответ - построить таблицу из 129 записей (или 257 записей), содержащую имена всех 7-битных символов ASCII (или 8-битных расширений в вашей предпочтительной кодовой странице) с дополнительным слотом для * 1012.*.
См. Источники функций, объявленных в <ctype.h>
, для примера обработки дополнительного пространства для EOF
.