2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Как примирить getch и стандартную процедуру ввода строки
Сообщение18.11.2005, 19:24 
Аватара пользователя
Под стандартной процедурой ввода строки я подразумевал gets, fgets, scanf или fscanf.

Задача - надо вводить символ без эхо-отображения, и в случае совпадения его с каким-либо символом из заданного набора - печатать его. После этого надо напечатать приглашение и ввести строку с клавы.

тестовая программка выглядит так:

Код:
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <conio.h>

char *keys = "12345\0";

int main(int n, char **args)
{
    char c, str[80];
   
    while(1)
    {
        c = getch();
        if(!strchr(keys, c))
            continue;
        putch(c);putch('\r');putch('\n');
        printf("Enter your name: ");
        gets(str);
    }
    return 0;
}


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

Код:
2
Enter your name: 2


Т.е. при вызове gets(str) почему-то печатается символ c, введенный раньше. Для ввода символа можно использовать getchar - результат тот же.

Компилировал прогу компилятором Microsoft из состава Microsoft Visual C++ 6.0, компилятором Watcom C/C++ 11.0, GNU C - поведение во всех случаях одинаковое. Во всех случаях создавалось windosw-приложение для текстового режима (win32 character-mode executable).

Как эту хрень исправить, знает кто-нибудь?

 
 
 
 
Сообщение18.11.2005, 19:38 
Аватара пользователя
У меня все нормально, ничего не печатается. Взял тот же код, пришлось только включить еще string.h. Microsoft Visual C++ 6.0. W32 console

Может, клавиатура западает?

 
 
 
 
Сообщение18.11.2005, 19:40 
Аватара пользователя
Попробуйте очистить консоль перед printf.

 
 
 
 
Сообщение18.11.2005, 19:53 
Аватара пользователя
PAV писал(а):
Попробуйте очистить консоль перед printf.


Какой процедурой? Полностью экран чистить нельзя. fflush(stdin/stdout) тоже не помогает.

Кстати, тестировал я только в Win98 second edition, может в этом дело? При выводе на консоль ведь используются процедуры ОС, насколько я понимаю. Клава не западает - на 2-х разных компах (и клавах) результат одинаковый. На обоих компах стоит одна и та же версия винды (по-моему, даже с одного и того же диска установлена).

 
 
 
 
Сообщение18.11.2005, 20:23 
Аватара пользователя
У меня XP. Попробуйте вызывать getch до тех пор, пока имеющиеся символы не закончатся.

 
 
 
 
Сообщение18.11.2005, 20:23 
У меня тоже не компилится.

 
 
 
 
Сообщение18.11.2005, 20:26 
Аватара пользователя
Попробуйте еще выводить введенный символ на экран не с помощью putch, а с помощью printf

 
 
 
 
Сообщение18.11.2005, 22:01 
Аватара пользователя
LynxGAV писал(а):
У меня тоже не компилится.


Оно не компилится, потому что я там забыл вбить строку

Код:
#include <string.h>


У меня откомпилировался наверно, только из-за того, что я файлу дал расширение "c", а не "cpp". Сейчас эту строку вставил - один черт.

Кстати, если символ вообще не выводить (убрать putch()) - после вызова gets он все равно появляется. Счас попробую этот тест под DOS откомпилить, интересно, что получится.

 
 
 
 
Сообщение18.11.2005, 22:43 
Аватара пользователя
Попробуйте вызвать getch еще раз перед gets, он что-то будет выдавать?

 
 
 
 
Сообщение22.11.2005, 01:15 
Аватара пользователя
:evil:
Пара идей:

- проверьте скорость автоповтора клавиатуры. Программисты и игроки часто повышают ее, и уменьшают задержку перед автоповтором. Тогда кажущееся одиночное нажатие на клавишу может оказаться кратным. Кроме того, стоят ли какие-нибудь автопереключатели клавиатуры? Может, имеет смысл попробовать уже странслированную программу на другом компьютере.

- попробуйте напечатать введенную строку. Интересно, будет ли там выбор повторяться? Можно ли эту цифру удалить backspace?

В целом, клавиатура буферизуется всеми ОС, и если нажать и подержать, любая кнопка "бежит". Непустоту буфера проверяют при помощи _kbhit() (не блокирует и не читает).

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group