Игнорировать возврат каретки в scanf перед данными .... чтобы сохранить расположение графики на консоли с conio.h - PullRequest
2 голосов
/ 15 марта 2010

У меня есть несчастье использования conio.h в vc ++ 6 для колледжа,

Моя проблема в том, что мои графические настройки находятся в центре экрана ...

например.

gotoxy( getcols()/2, getrows()/2);
printf("Enter something");
scanf( "%d", &something );  

Теперь, если кто-то случайно нажал клавишу ввода, прежде чем ввести «что-то», курсор будет сброшен слева от экрана на следующей строке.

Iv попытался очистить буферы клавиатуры и BIOS с помощью fflush (stdin) и getchar (), что, как я и ожидал, не сработало!

Любая помощь / идеи будут оценены, Спасибо, В

Ответы [ 2 ]

3 голосов
/ 15 марта 2010

Попробуйте прочитать ввод пользователя по одному символу за раз. Если обнаружен возврат каретки вперед, игнорируйте символ и еще раз введите код gotoxy( getcols()/2, (getrows()/2)+1), чтобы переместить курсор в соответствующее место (добавив одну строку, чтобы избежать записи поверх ранее выведенного сообщения).

2 голосов
/ 16 марта 2010

Дорога к успеху будет заключаться в том, чтобы выполнять то, о чем вас попросит задание :) В частности, вы должны использовать одну или несколько функций из conio.h для чтения ввода. scanf() - это , а не функция conio.h.

Потому что Я ленивый Это домашнее задание, я не буду писать код для вас.

Одной из возможностей будет использование cscanf() вместо scanf(). Но это может (я не знаю) эхо-символы ввода, которые включают случайный Ввод , и не решат вашу проблему.

Если это так, моя стратегия заключается в том, чтобы написать цикл для сбора символов, введенных с клавиатуры, используя функцию getch() без эха. Вы можете игнорировать символы новой строки, пока у вас не будет хотя бы одного печатаемого символа, а затем принимать символы (и сохранять их в массиве символов или как угодно), пока не получите новую строку. Поскольку вводимые символы не будут отображаться, я думаю, что курсор не будет двигаться.

Затем вы можете сканировать входные символы из входного буфера, используя sscanf(). Вы захотите посчитать вводимые символы, чтобы убедиться, что ваш пользователь не переполняет ваш буфер. Также, возможно, некоторая обработка ошибок в случае неверных данных.

РЕДАКТИРОВАТЬ: Кое-что я забыл упомянуть: за вашим последним входным символом в буфере должен следовать нулевой символ ('\0'), поэтому sscanf() завершится правильно. Возможно, что ваш буфер по умолчанию заполнен нулями, но его намеренно вставьте в него (например, когда вы нажмете последнюю строчку), что сделает ваш код более правильным и надежным.

...