2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Как примирить getch и стандартную процедуру ввода строки
Сообщение18.11.2005, 19:24 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Под стандартной процедурой ввода строки я подразумевал 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 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
У меня все нормально, ничего не печатается. Взял тот же код, пришлось только включить еще string.h. Microsoft Visual C++ 6.0. W32 console

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

 Профиль  
                  
 
 
Сообщение18.11.2005, 19:40 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Попробуйте очистить консоль перед printf.

 Профиль  
                  
 
 
Сообщение18.11.2005, 19:53 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
PAV писал(а):
Попробуйте очистить консоль перед printf.


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

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

 Профиль  
                  
 
 
Сообщение18.11.2005, 20:23 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
У меня XP. Попробуйте вызывать getch до тех пор, пока имеющиеся символы не закончатся.

 Профиль  
                  
 
 
Сообщение18.11.2005, 20:23 
Заслуженный участник


28/10/05
1368
У меня тоже не компилится.

 Профиль  
                  
 
 
Сообщение18.11.2005, 20:26 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Попробуйте еще выводить введенный символ на экран не с помощью putch, а с помощью printf

 Профиль  
                  
 
 
Сообщение18.11.2005, 22:01 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
LynxGAV писал(а):
У меня тоже не компилится.


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

Код:
#include <string.h>


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

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

 Профиль  
                  
 
 
Сообщение18.11.2005, 22:43 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Попробуйте вызвать getch еще раз перед gets, он что-то будет выдавать?

 Профиль  
                  
 
 
Сообщение22.11.2005, 01:15 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Пара идей:

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

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group