Я хочу организовать ввод пароля, чтобы вместо символа в консоли появлялись звездочка, если нажата клавиша Enter ввод заканчивается. Вместо одной звездочки при вводе символа появляются две, в чем проблема?
char c{};
while ((c = _getch()) != 13)
{
_putch('*');
}
Словом, как выяснилось, это баг. Который предлагают решать путем статической линковки с более старой версией рантайма C, но, понятно, что это метод, мягко говоря, очень невеселый.
Ждем обновлений Windows/Visual C++ с исправлением бага...
Update
VC++ 2017 15.8.7 - при компиляции с динамической библиотекой (/MD
) работает нормально, при статической - нет...
Update2
Нормально работает при установке SDK версии 10.0.17763.0
Раз метка c++
, то используйте стандарт c++
: c++ ввод, c-style ввод в c++. Там функций _getch()
и _putch()
нет.
Как говорится что посеяли, то и пожинаете...
Условие вашего цикла: вводить символ, сравнить с числом 13, если нет равенства, то выводить звездочку. Вы вводите символ, потом нажимете enter
, что является еще одним символом, потому и два раза выводится звездочка.
Желаемый результат(чтобы выводить столько звездочек, сколько символов вводите, не учитывая пробел, можете получить так:
while ((c = getchar()) != 13 && c != '\n')
{
if (c == ' ') continue;
putchar('*');
}
Как видите, все нужно контролировать самим, так почему же не воспользоваться инструментами, предоставленными библиотекой?...
while (std::cin >> c && c != 13)
std::cout << '*' ;
Вот так работает в 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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Начал изучать OpenGL по курсу "Gameinstitute - OpenGL Graphics Programming"В третьем видио на восемнадцатой минуте происходит сборка сцены, а у меня повыпрыгивали...
Почему-то поток ввода не дает знаки пробелов/перехода на новую строкуФрагмент кода: