C++ проблемы getch putch

219
19 февраля 2019, 06:20

Я хочу организовать ввод пароля, чтобы вместо символа в консоли появлялись звездочка, если нажата клавиша Enter ввод заканчивается. Вместо одной звездочки при вводе символа появляются две, в чем проблема?

char c{};
while ((c = _getch()) != 13)
{
    _putch('*');
}
Answer 1

Словом, как выяснилось, это баг. Который предлагают решать путем статической линковки с более старой версией рантайма C, но, понятно, что это метод, мягко говоря, очень невеселый.

Ждем обновлений Windows/Visual C++ с исправлением бага...

Update

VC++ 2017 15.8.7 - при компиляции с динамической библиотекой (/MD) работает нормально, при статической - нет...

Update2

Нормально работает при установке SDK версии 10.0.17763.0

Answer 2

Раз метка c++, то используйте стандарт c++: c++ ввод, c-style ввод в c++. Там функций _getch() и _putch() нет.

Answer 3

Как говорится что посеяли, то и пожинаете...

Условие вашего цикла: вводить символ, сравнить с числом 13, если нет равенства, то выводить звездочку. Вы вводите символ, потом нажимете enter, что является еще одним символом, потому и два раза выводится звездочка. Желаемый результат(чтобы выводить столько звездочек, сколько символов вводите, не учитывая пробел, можете получить так:

while ((c = getchar())  != 13 && c != '\n')
    {
        if (c == ' ')  continue;
         putchar('*');    
    }

Как видите, все нужно контролировать самим, так почему же не воспользоваться инструментами, предоставленными библиотекой?...

 while (std::cin >> c && c != 13)
         std::cout << '*' ;
Answer 4

Вот так работает в Visual Studio 2017, зато не работает в других компиляторах

    #include "stdafx.h" 
    #include <iostream> 
    #include <string> 
    #include <conio.h>
    using namespace std;
    int main()
    {
        string s{};
        char c{};
        while ((c = _getch()) != 13)
        {
            _getch();
            s += c;
            _putch('*');
        }
        cout << endl << s <<  endl;
    return 0;
    }
READ ALSO
OpenGL не видит функции библиотек glew и glfw

OpenGL не видит функции библиотек glew и glfw

Начал изучать OpenGL по курсу "Gameinstitute - OpenGL Graphics Programming"В третьем видио на восемнадцатой минуте происходит сборка сцены, а у меня повыпрыгивали...

203
В чем подвох(ifstream)?

В чем подвох(ifstream)?

Почему-то поток ввода не дает знаки пробелов/перехода на новую строкуФрагмент кода:

210
std::map, std:unordered_map и ключ-структура

std::map, std:unordered_map и ключ-структура

Есть вот такая простенькая структура:

207
С++ std::map заполнение из файла

С++ std::map заполнение из файла

Есть вот такой вот map

178