Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 27.04.2011
Сообщений: 7

getch(); ожидает ESC и при этом ест вводимый символ

28.05.2011, 23:14. Показов 6900. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
кусочек программы словаря процедура перевода слов с английского на русский

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
struct types                        
{
   char rus[20],angl[20];               
};
 
FILE *in;int j;char c;
 
void angl_rus()
{
 netF;
 char sl[30];
 clrscr();
 printf ("Введите нужное английское слово:\n");
 while(c!=27){
scanf("%s",&sl);
 types a;
 int p=0;
 in = fopen("slovar.txt", "r");
 while (!feof(in)) {
 fscanf(in,"%s %s",&a.rus,&a.angl);
 if (strcmp(sl,a.rus)==0)
     {
      p=1;
      printf("%s %s\n",a.rus,a.angl);
     }
 }
 if (p==0) printf("Извините, но такого слова в словаре нет\n");
 c=getch();
}
}
Проблема в том что c=getch, ожидая нажатия клавиши ESC , забирает следующий вводимый символ пользователем, поэтому ему приходится набирать первый символ два раза, очень неприятная мелочь, думаю проблема решается как то легко, но я начинающий, поэтому дайте мысль
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.05.2011, 23:14
Ответы с готовыми решениями:

Getch() + ncurses = НЕ ожидает нажатие символа
Дорогие товарищи-друзья! Linux на удалённой машине, g++, установлен ncurses, код программы такой: #include <iostream> ...

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

Найти вводимый символ с клавиатуры
Всем Добрый вечер! Не могу никак понять где находится вводимое число с клавиатуры. Тип консольный. Листинг с примером ввода цифры...

16
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
29.05.2011, 00:32
Проверил на простенькой программе - у меня getch() на нажтие esc никак по особенному не игнорирует, ну да а вообще если вам задержку надо сделать то это же не обязательно надо использовать старый бородатый getch, есть много других способов,
C++
1
system("PAUSE")
например.
0
0 / 0 / 0
Регистрация: 27.04.2011
Сообщений: 7
29.05.2011, 00:53  [ТС]
Цитата Сообщение от Gepar Посмотреть сообщение
Проверил на простенькой программе - у меня getch() на нажтие esc никак по особенному не игнорирует, ну да а вообще если вам задержку надо сделать то это же не обязательно надо использовать старый бородатый getch, есть много других способов,
C++
1
system("PAUSE")
например.
я использую getch для того чтобы отследить когда пользователь нажмет ESC, для выхода в меню назад, но если ему не надо выйти в меню назад, то он вводит слово которое хочет перевести, но первый символ не вводится,приходится пользователю нажимать два раза первый символ, я так понимаю это происходит из за getch
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
29.05.2011, 01:05
C++
1
2
scanf("%s",&sl);
 fscanf(in,"%s %s",&a.rus,&a.angl);
& -убрать
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
29.05.2011, 01:12
Цитата Сообщение от goth Посмотреть сообщение
я так понимаю это происходит из за getch
Кажется я понял как работает ваша программа, тогда вам надо сделать что-то вроде этого, хотя опять же таки из-за getch символ будет считан, но его будет не видно (при вводе abba в переменную будет считано abba, но на экране будет видно только ввод bba).
C++
1
2
3
4
5
6
7
8
9
{
    int c;
    char d[128];
    c=getch();
    if(c!='27')
     cin.putback(c);
    cin>>d;
    cout<<d;
}
Советую всё же отказаться от его использования.
 Комментарий модератора 
Используйте теги форматирования кода!
1
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
29.05.2011, 07:27
Цитата Сообщение от Gepar Посмотреть сообщение
...хотя опять же таки из-за getch символ будет считан, но его будет не видно (при вводе abba в переменную будет считано abba, но на экране будет видно только ввод bba).
Ну, а что мешает вывести на экран этот символ cout << (char) c;
0
0 / 0 / 0
Регистрация: 27.04.2011
Сообщений: 7
29.05.2011, 15:32  [ТС]
Цитата Сообщение от Gepar Посмотреть сообщение
Кажется я понял как работает ваша программа, тогда вам надо сделать что-то вроде этого, хотя опять же таки из-за getch символ будет считан, но его будет не видно (при вводе abba в переменную будет считано abba, но на экране будет видно только ввод bba).
C++
1
2
3
4
5
6
7
8
9
{
    int c;
    char d[128];
    c=getch();
    if(c!='27')
     cin.putback(c);
    cin>>d;
    cout<<d;
}
Советую всё же отказаться от его использования.
спасибо за помощь, но почему то не вышло , нагуглил про команду cin.putback я так понял она работает не всегда, видать это мой случай, хотя вроде все просто и должно работать. Юзаю борланд с++ 3.1.=)

решаю свою проблему примерно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
COORD pos={0,0};
char sss[255];
int z=0;
c=getch;
while(1)
{
    if(c==27)   break;
    while(1)
    {
        if(c=='\n') break;
        sss[z]=c;
        WriteConsoleOutputCharacter(conout,&c,1,pos,&res);
        z++;
        pos={z,0};
        c=getch();
    }
}
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
29.05.2011, 17:46
А где проверка z != 254, где повтороное обнуление z?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
31.05.2011, 16:18
Что значит cin.putback работает не всегда? Вы что-то как прочитаете, в даном случае cin.putback(c) возвращает в входящий поток символ находящийся в переменной с. То возвращать то не возвращать оно не может же, это программирование, а не теория вероятностей.
0
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 26
28.08.2025, 22:45
Добрый день!
Тоже беспокоила эта проблема с проглатыванием первого символа при выводе c помощью сout после использования _getche() и клавиши ESC.
Как я понял, в этой ситуации просто проглатывается первый символ при выводе. Т.е., нужно просто перед выводом нужного текста вывести один любой символ - который и проглотится. После чего выводим все что нужно.
Т.е. просто перед нужным выводом вставляем вывод, например единички::
cout<<1;
cout<<"А тут уже выводим то, что нужно";
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
29.08.2025, 08:14
allar8, Вы не поняли суть проблемы.
getch() - функция низкоуровневого ввода, которая берет символ прямо с клавиатуры
и НЕ ОТОБРАЖАЕТ его на экране. Поэтому-то его и не видно.
0
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 26
29.08.2025, 08:28
Добрый день!
Ааа. Простите - сам начинающий. Искал решение своей проблемы на форуме и увидел в теме знакомые слова). Но спасибо - ваш форум помог - пусть и так)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
29.08.2025, 11:13
Цитата Сообщение от zss Посмотреть сообщение
getch() - функция низкоуровневого ввода
Ох уж эта "Коняка.АШ" )
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12935 / 6802 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
29.08.2025, 17:11
Цитата Сообщение от allar8 Посмотреть сообщение
Тоже беспокоила эта проблема с проглатыванием первого символа при выводе c помощью сout после использования _getche() и клавиши ESC.
Какая "эта проблема с проглатыванием первого символа при выводе", если в теме с самого начала ясно написано, что речь идет о потере символа при вводе? Причем прекрасно понятно, почему происходит такая потеря - автор кода сам его потерял.

О какой "проблеме с проглатыванием первого символа при выводе" вы ведете речь - в упор не ясно. Где вы видели такое "проглатывание"?
0
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 26
28.12.2025, 02:55
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
О какой "проблеме с проглатыванием первого символа при выводе" вы ведете речь - в упор не ясно. Где вы видели такое "проглатывание"?
Добрый день!
Вот в моей программе поиска наибольшего элемента массива с самопальным классом CIN с выходом по ECS:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <conio.h> // для _getche()
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <string>
#include <Windows.h> // для SetConsoleCP(1251); SetConsoleOutputCP(1251);
using namespace std;
///////////////////////////////////////////////////////////////////////////////
static bool flag = 1;
struct rez
{
    int el;
    int ind;
};
class CIN
{
public:
    CIN() : a(1) {}
    int fget_simpl();
 
private:
    int a;
};
 
int CIN::fget_simpl()
{
    char ch[10] = { 0 };
    int j = 0;
    a = 0;
    while (ch[j] != 27)
    {
        ch[j] = _getche();
        if (ch[0] == 27)
        {
            flag = 0;
            a = 0;
            break;
        }
        else if (ch[j] == '\r')
        {
            flag = 1;
            break;
        }
        else
        {
            a = a * 10 + ch[j] - '0';
            j++;
        }
    }
    return a;
}
rez maxint(int[], int);
//////////////////////////////////////////////////////////////////////////////
 
int main()
{
    SetConsoleCP(1251); SetConsoleOutputCP(1251);
    ///////////////////////////////////////////////////////////////////
    int d[100];
    CIN CIN1;
    rez result;
    char ch = 'a';
    int k = 0;
    do
    {
        cout << "Введите " << k + 1 << "-ое число: "; d[k++] = CIN1.fget_simpl(); cout << endl;
    } while (flag);
    //cout << 1; //даем съесть проглоченный первый символ после _getche() и ESC
    for (int i = 0; i < k - 1; i++)
    {
        cout << d[i] << endl;
    }
    result = maxint(d, k - 1);
    cout << "Максимальный элемент: " << result.el << " на " << result.ind << "-й позиции" << endl;
 
    //////////////////////////////////////////////////////////////////
    return 0;
}
rez maxint(int df[], int kf)
{
    rez rezult;
    int temp = 0, im = 0;
    bool flag1 = 0;
    for (int i = 0; i < kf; i++)
    {
        if (df[i] > df[i + 1])
        {
            temp = df[i];
            df[i] = df[i + 1];
            df[i + 1] = temp;
            if (!flag1) im = i;
            flag1 = 1;
        }
        else flag1 = 0;
    }
    rezult.el = df[kf];
    rezult.ind = im + 1;
    return rezult;
}
Если закомментировать строку 70, то в результате, например, следующего диалога программы, как видите, при нажатии ESC после запроса четвертого числа, в списке введенных элементов у первого элемента выводится только вторая цифра, т.е. вместо 56 выводится только 6. Т.е. цифра "5" не выводится - как бы "проглатывается" после нажатия ESC в цикле c _getche() в методе fget_simpl() - строка 27 в классе СIN:

"
Введите 1-ое число: 56
Введите 2-ое число: 59
Введите 3-ое число: 17
Введите 4-ое число: [тут нажимаем ECS]
6
59
17
Максимальный элемент: 59 на 2-й позиции

D:\Cloud\Программирование\2025\ConsoleAp plication1\x64\Debug\ConsoleApplication1 .exe (процесс 8416) завершает работу с кодом 0.
Чтобы закрыть это окно, нажмите любую клавишу…
"


Предполагаю, что это как-то связано с тем, что ESC состоит из двух ASCII кодов, а функция _getche() обрабатывает за раз только один ASCII код
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
28.12.2025, 06:14
allar8, Что-то Вы сильно перемудрили
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <conio.h> 
#include <cstdlib>
 
using namespace std;
///////////////////////////////////////////////////////////////////////////////
 
struct rez
{
    int el;
    int ind;
};
namespace CIN
{
    static bool flag = true;
    int fget_simpl();
};
 
int CIN::fget_simpl()
{
    int ch;
    int a=0;
    while (true)
    {
        ch = _getche();
        if (ch == 27)
        {
            flag = false;
            break;
        }
        if (ch == '\r')
        {
            flag = true;
            break;
        }
        if(ch>='0' && ch<='9')
            a = a * 10 + ch - '0';
    }
    return a;
}
//--------------------------------------------------------
rez maxint(int df[], int kf)
{
    rez rezult;
    rezult.el = df[0];
    rezult.ind = 0;
    for (int i = 1; i < kf; i++)
    {
        if (df[i] > rezult.el)
        {
            rezult.el=df[i];
            rezult.ind = i;
        }
    }
    return rezult;
}
//--------------------------------------------------------
int main()
{
    system("chcp 1251 > NUL"); 
 
    int d[100];
    int k = 0;
    do
    {
        cout << "Введите " << k + 1 << "-ое число: "; 
        d[k++] = CIN::fget_simpl(); 
        cout << endl;
    } while (CIN::flag && k<100);
    for (int i = 0; i < k; i++)
    {
        cout << d[i] << endl;
    }
    rez result = maxint(d, k );
    cout << "Максимальный элемент: " << result.el << " на " << result.ind 
        << "-й позиции" << endl;
    cin.get();
    return 0;
}
0
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 26
28.12.2025, 13:42
Цитата Сообщение от zss Посмотреть сообщение
allar8, Что-то Вы сильно перемудрили
Ну это запросто. И некоторые детали в Вашем варианте, мне пока непонятны. Я отрабатывал навыки по классам в том числе - поэтому выглядит перемудрено)
А в вашем варианте сохраняется проблема с "проглатыванием"? ну по крайне мере у меня

Введите 1-ое число: 12
Введите 2-ое число: 65
Введите 3-ое число: 65
Введите 4-ое число: [Тут нажимаем ESC]
2
65
65
0
Максимальный элемент: 65 на 1-й позиции


единичка "проглотилась" при выводе первого элемента
Как я и говорил - не хватает перед выводом введенных элементов дать "съесть" какой-нибудь символ функции _getche()

И еще есть недостаток - выводится последний 0. Я это убирал. И на единицу ошибается программа Ваша - 65 не первое введенное число, а второе по моей задумке.
Но все это не суть. Меня спросили - что "проглатывается"? - я показал.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Где вы видели такое "проглатывание"?
Миниатюры
getch(); ожидает ESC и при этом ест вводимый символ  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.12.2025, 13:42
Помогаю со студенческими работами здесь

Как отобразить вводимый символ с клавиатуры
Доброго времени суток ! Такой вопрос : - Вводим символ с клавиатуры, нужно получить его код в разных системах счисления (2,8,16) ...

Getch() выдает лишний символ
Доброго, после обновлении возникли проблемы с функции getch(), которая возвращает нажатый символ. Помимо нажатого символа, _getch()...

В какой кодировке getch() возвращает символ?
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;conio.h&gt; int main() { SetConsoleOutputCP(1251); char ch; do ...

Заменить вводимый пользователем в ячеку DataGridView символ на другой
Конкретный пример того что хотелось бы сделать: пользователь вводит число пытаясь поставить десятичный разделитель &lt;точку&gt;, а...

Вводимый символ с клавиатуры и перемещение его с использованием цифр
Выводить в текущее положение курсора символ, введённый с клавиатуры. Этот же символ выводить в позицию выше, ниже, левее или правее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru