Что вам нужно сделать, это проверить, доступен ли символ с помощью функции getch (). Если вы используете его в режиме без задержки, метод не будет блокироваться. Затем вам нужно съесть символы, пока не встретите '\ n', добавляя каждый символ к результирующей строке по ходу.
В качестве альтернативы - и метод, который я использую - это использовать библиотеку GNU readline. Он поддерживает неблокирующее поведение , но документация по этому разделу не так хороша.
Здесь приведен небольшой пример, который вы можете использовать. Он имеет цикл выбора и использует библиотеку чтения строки GNU:
#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <stdlib.h>
#include <stdbool.h>
int quit = false;
void rl_cb(char* line)
{
if (NULL==line) {
quit = true;
return;
}
if(strlen(line) > 0) add_history(line);
printf("You typed:\n%s\n", line);
free(line);
}
int main()
{
struct timeval to;
const char *prompt = "# ";
rl_callback_handler_install(prompt, (rl_vcpfunc_t*) &rl_cb);
to.tv_sec = 0;
to.tv_usec = 10000;
while(1){
if (quit) break;
select(1, NULL, NULL, NULL, &to);
rl_callback_read_char();
};
rl_callback_handler_remove();
return 0;
}
Компилировать с:
gcc -Wall rl.c -lreadline