Здравствуйте, мне необходимо сделать функцию ввода строки, строка вводится до тех пор, пока пользователь не нажмет 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
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. Если видите такой код - считывайте второй код и игнорируйте их оба. Только вот о, скажем, русском языке при этом придется забыть...
Комментариев нет:
Отправить комментарий