KEY_ENTER против '\n'?

Когда я использую PDcurses и пытаюсь выйти из цикла while, когда клавиша ввода нажата с while(key != KEY_ENTER), цикл while никогда не завершается. Однако, когда я пытаюсь выполнить тот же выход из цикла с помощью while((char)key != '\n'), он успешно завершается всякий раз, когда я нажимаю ввод. Почему '\n' работает, а KEY_ENTER нет?

Кстати, key - это целое число

и я надеюсь, что это соответствующие несколько строк кода:

int key;
while((char)key != '\n') {
    key = getch();
    ...
}

person wrongusername    schedule 03.06.2010    source источник


Ответы (2)


getch() — это функция, определенная стандартом ANSI C для библиотеки времени выполнения C.

В большинстве систем, таких как Windows, Linux и т. д., эта функция реализована так, чтобы возвращать '\n', когда пользователь нажимал Enter. Для сравнения, в Windows само нажатие клавиши (Enter) может быть представлено как код клавиши VK_ENTER.

PDCurses переводит коды клавиш в значения ASCII для вас.

Вы можете получить нужные значения ключей, если сначала вызовете функции PDCurses raw(); nonl();. Кроме того, вам, вероятно, следует использовать wgetch() для нового кода.

person Heath Hunnicutt    schedule 03.06.2010
comment
каковы преимущества использования wgetch()? - person wrongusername; 03.06.2010
comment
getch() — это макрос, который конфликтует со стандартной функцией C с таким именем. wgetch(WINDOW *) не будет конфликтовать. Вы можете создать свой собственный макрос замены, если вам нравится отсутствие аргумента, возможно, назовите его getkey() или getcursed(). - person Heath Hunnicutt; 03.06.2010
comment
Другая проблема с getch() и использованием int для символов - это unicode. Вы не можете представить все возможные символы, которые пользователь может ввести в int, а getch() появился в дни ASCII. - person Stephen P; 03.06.2010
comment
@Stephen - я сначала так и думал, но не уверен, какие проклятия вернет getch(). - person Heath Hunnicutt; 03.06.2010
comment
Где именно getch() определено в стандарте? Я никогда этого не видел. - person Avidan Borisov; 04.04.2013
comment
@HeathHunnicutt: getch никогда не входил в стандартную библиотеку. Однако он был включен в conio.h - person Daniel Kamil Kozar; 07.06.2016

KEY_ENTER == 0x157, '\n' == 0xA

'\n' — это стандартная новая строка ASCII, а KEY_ENTER представляет собой код клавиатуры. См. код PDCurses.

Для получения дополнительной информации вы должны опубликовать соответствующую часть вашего кода.

person Matthew Flaschen    schedule 03.06.2010
comment
Потому что после того, как вы нажали Enter, key == '\n'. Он не может равняться двум вещам одновременно. Вы должны опубликовать свой код, если вам нужна дополнительная помощь. - person Matthew Flaschen; 03.06.2010
comment
Я не понимаю, как key, будучи int (поэтому оно не может равняться '\n' в любое время, верно?), не равно KEY_ENTER после нажатия клавиши, но (char)key действительно равно \n - person wrongusername; 03.06.2010
comment
Да, int может равняться символьной константе. Попробуйте int c = 10; if(c == '\n') { doSomething(); } - person Matthew Flaschen; 03.06.2010