Как ввести символ или строку, не нажимая клавишу возврата

#c #objective-c

#c #objective-c

Вопрос:

Я изучаю Objective C с использованием Foundation и вывода на консоль. Я хотел бы знать (и как), возможно ли ввести символ или строку, и они будут распечатаны автоматически, не нажимая клавишу возврата (или любую другую клавишу). Очевидно, что приведенный ниже простой код по-прежнему требует нажатия клавиши возврата. Я знаю, что этот код смешан между C и ObjC, но я пробовал разные идеи. Я также пытаюсь сделать это без использования Ncurses. Заранее спасибо.

ввод символа [1];

 NSLog(@"enter key:");

fgets(input, 1, stdin);

NSString *inputString = [[NSString alloc]initWithCString:input];

NSLog(@"Input = %s",input); 
  

Я только что нашел хороший ответ следующим образом:
// Перевести терминал в необработанный режим
system («stty raw»);

 // Wait for single character 
char input = getchar(); 

// Echo input:


// Reset terminal to normal "cooked" mode 
system("stty cooked"); 

// And we're out of here 

NSLog(@"INPUT = %c",input);
  

Комментарии:

1. Задано 8 вопросов, ни один не принят и не подано ни одного голоса — люди могут задаться вопросом, почему они должны уделять вам приоритетное внимание в своем драгоценном времени.

2. @KerrekSB — для тех, кто ищет. Люди, желающие получить ответы на те же вопросы, которые теперь их найдут. Может даже дать вам преимущество, если это то, что вам нужно. Не все участвуют одинаково.

3. Вы знаете, что ваше решение с system() запускает полную оболочку в подпроцессе, который в данном случае выполняет почти то же самое, что cfmakeraw() упомянуто в моем ответе, верно? Кроме того, в руководстве для stty упоминаются флаги tty, которые устанавливают необработанные параметры, так почему бы просто не установить их с помощью tcsetattr ? У меня такое чувство, что вы намеренно игнорируете ответы, которые получаете.

4. @KerrekSB немного расслабься — ты кажешься таким горьким и печальным. В моем сообщении четко указано, что я новичок в objective C, и у меня есть искренний вопрос. На сегодняшний день этот сайт был действительно полезен, и, похоже, хорошие люди — не подведите его.

5. @KateGregory — Меня не интересуют положительные отзывы. Я просто нашел ответ и подумал, что это может помочь другим, читающим этот пост.

Ответ №1:

Прочитайте руководство для tcsetattr и tcgetattr . Найдите флаги ICANON и IECHO и ознакомьтесь с частью о cfmakeraw . Документация console_ioctl(4) и tty_ioctl(4) может представлять дополнительный интерес, например, для определения размера tty.

Комментарии:

1. Спасибо за ваш ответ — мне нужно некоторое время, чтобы разобраться с этим.

2. и вы нашли решение? Как прошли тесты?

Ответ №2:

Взгляните на http://pwilson.net/sample.html и выполните поиск kbhit.c . Эта функция должна работать для вас, хотя она не была протестирована с Objective C.