2009-10-01 3 views
4

В Unix, когда я нажимаю клавишу со стрелкой, она показывает эту строку, но в то время как scanf не принимает ее как вход. Пожалуйста, объясните, как принять его в качестве входных данных. Можем ли мы что-то сравнить персонажа с charater, как первый^[это клавиша Esc и т. Д.?^[[Символьная комбинация

ответ

7

Это escape-последовательность, сгенерированная этим ключом. '^[' - CTRL-[ (знак ESC), а два других символа: '[' и 'A'.

Если вы хотите обработать их, вам нужно будет прочитать все три символа и решить, что они означают, что пользователь нажал клавишу со стрелкой вверх.

Независимо от того, сможете ли вы это сделать с scanf, зависит от строки формата. Для этого я бы использовал более низкий уровень ввода символов.

I never[f]scanf в реальном коде с момента выхода из строя, в результате чего вы не знаете, где находится указатель ввода. Для линейного ввода я считаю, что всегда лучше использовать fgets, а затем sscanf полученную строку.

Но, как я уже сказал, вы должны использовать getc и его братьев для ввода/вывода символов низкого уровня. Или найти функцию более высокого уровня, такую ​​как readline под Linux, или другие библиотеки, которые знают, чтобы преобразовать их в специальные коды ключей, такие как VK_KEY_UP, которые вы можете обрабатывать.

+0

Хорошо, у меня есть. У меня есть одна проблема. Как в оболочке, как только, когда мы нажимаем клавишу со стрелкой, она показывает историю команд мгновенно. Но вышеупомянутый метод comaprison требует взять новую строку с завершенной строкой, а затем сравнить символ по charac. Пожалуйста, скажите мне, как оболочка обрабатывает комбинацию из 3-х символов, как только нажимается charator? – avd

+2

Устанавливает терминал в режим RAW. В этом режиме терминал отправляет вам символы по мере их ввода. В режиме COOKED (по умолчанию для приложений) терминал собирает целую строку и затем отправляет ее в приложение. –

+1

Скорее всего, bash (или readline, который, как мне кажется, он использует под обложками), поставил терминал в необработанный режим, где персонажи сразу приводятся в приложение. Альтернативой является режим варки, где в приложение добавляется только полная строка. Это с первых дней, когда было неэффективно иметь компьютерные символы. Мейнфрейм был еще хуже в том, что он отправил целые экраны в программу при нажатии ENTER. – paxdiablo

Смежные вопросы