Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

Ввод строки с помощью getch()

Здравствуйте, мне необходимо сделать функцию ввода строки, строка вводится до тех пор, пока пользователь не нажмет ENTER. Вот собственно сам код:
char* GetLine() { char* line = NULL; char ch; int i = 0; while(true){ ch = getch(); //Считываем, но не выводим символ switch(ch) { case '
': line = (char*)realloc(line, (i + 1) * sizeof(char)); line[i++] = '\0'; //Признак конца строки return line; case '\b': printf("\b \b"); //Удаляем символ в консоле if (i > 0) i--; break; default: putchar(ch); line = (char*)realloc(line, (i + 1) * sizeof(char)); line[i++] = ch; } } }
В чем собственно проблема, мне нужно, чтобы при нажатии отдельных клавиш (F1-F12, Esc, цифры на numpade и т.п) они не выводились в консоль. Я знаю, что можно свитчем сделать перебор всех клавиш сканкодом, но мне кажется должно быть решение полегче.


Ответ

В комментарии ответить - места не хватит...
В данном случае вас совершенно не должен волновать буфер ввода, так как вы все равно заканчиваете свой ввод нажатием Enter. Как его отрабатывает компилятор и операционная система - это их проблемы. Вот код -
#include #include #include
char * read() { size_t size = 8; char * buf = (char*)malloc(size*sizeof(char)); size_t count = 0;
for(int c = ' ' /*Неважно что, лишь бы не нуль */;c;) { c = getchar(); if (c == EOF || c == '
') c = '\0'; if (count == size) { buf = (char*)realloc(buf,size *= 2); } buf[count++] = c; } return buf; }
int main() { char * s = read(); printf("You wrote: [%s]
",s); free(s); }
Вводите хоть мегабайтную строку, лишь бы realloc отработал. Препод тут, я считаю, в корне неправ.
В случае getch() всякие функциональные клавиши дают 2 кода подряд, первый - 0 или 0xE0. Если видите такой код - считывайте второй код и игнорируйте их оба. Только вот о, скажем, русском языке при этом придется забыть...

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

Отправить комментарий