Помогите с вводом пароля.

Проблема в том что надо чтобы считался только правильный пароль.
Если вводишь верный пароль и потом еще любой текст, то оно считает что пароль введен правильно.
Помогите исправить проблему.

#include<iostream>
#include<locale>
#include<conio.h>
#include<iomanip>

using namespace std;

int main()
{
setlocale(LC_CTYPE, "Russian");
unsigned short nPassword = 11;
unsigned short chPassword = 0;

do{
system("cls");
wcout<<L"Введите пароль: ";
cin>>chPassword;
cin.clear();
cin.sync();
if(chPassword == nPassword)
    wcout<<L"Пароль введен верно.";
else
    wcout<<L"Пароль введен неверно.Повторите попытку";    
_getch();
}while(chPassword!=nPassword);
    _getch();
}

Пароль должен быть строкой символов (типа char* или string — не важно), а не числом, как в данном случае, unsigned short.

В твоей программе оператор cin>>chPassword пытается получить из cin число и только число. Поэтому при вводе «11бла-бла-бла» оператор >> хавает цифры до первого неподходящего символа и преобразует их к требуемому типу unsigned short. Остаток ввода «бла-бла-бла» остаётся в буфере для следующего оператора чтения из потока. Этот остаток ты прибиваешь в буфере ввода вызовом cin.clear();.

Проверяется элементарно:

#include<iostream>
#include<locale>
#include<conio.h>
#include<iomanip>
#include <string>

using namespace std;

int main()
{
setlocale(LC_CTYPE, "Russian");
unsigned short nPassword = 11;
unsigned short chPassword = 0;

string rest;


do{
    system("cls");
    wcout<<L"Введите пароль: ";
    cin>>chPassword;

    cin >> rest;
    wcout << L"Остаток ввода: [" << rest.c_str() << L"]" << endl;

    cin.clear();
    cin.sync();
    if(chPassword == nPassword)
        wcout<<L"Пароль введен верно.";
    else
        wcout<<L"Пароль введен неверно.Повторите попытку";    
    _getch();
}while(chPassword!=nPassword);
    _getch();
}

Введи в качестве пароля 11qwerty и получишь «остаток ввода» qwerty. А 11 было преобразовано в число и успешно прошло проверку в качестве пароля.

Спасибо, разобрался.

Вот готовый код.

#include<iostream>
#include<locale>
#include<conio.h>

using namespace std;

int main()
{
setlocale(LC_CTYPE, "Russian");
string nPassword = "11";
string chPassword;
do{
    system("cls");
wcout<<L"Введите пароль: ";
getline(cin, chPassword);
if(chPassword==nPassword)
{
    wcout<<L"Доступ разрешен."<<endl;
    _getch();
}
else
{
    wcout<<L"Пароль введен неверно. Повторите попытку."<<endl;
    _getch();
}
}while(chPassword!=nPassword);
return EXIT_SUCCESS;
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.