Маскировка пароля в программе входа в С++

Я нахожусь где-то между новичком и хорошо разбираюсь в С++, и мне удалось написать базовую программу входа в систему на С++, используя Dev C++, Windows 7. Эта программа могла принимать входные данные для имени пользователя и пароля и сравнивать их, чтобы увидеть, если они были равны. Если это так, он приветствовал бы пользователя и завершал программу, а если нет, то возвращался бы к началу (бесконечно).
Затем я просмотрел несколько руководств в сети, чтобы замаскировать пароль в C и попытался сделать это сам на С++.
С кодом, который я включил ниже, я не получаю никаких ошибок, но и не получаю желаемого результата. В конце концов, даже если я ввожу правильный «пароль», мне всегда говорят попробовать еще раз. Также программа маскирует все, включая клавиши «Enter» и «Backspace». Вот код:

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

using namespace std;
int main()

   {
   int i=0;string u;char parr[i],ch;
   while (1)
   { 
     system("cls");
     cout<<"Enter username."<<endl;
     cin>>u;
     system("cls");
     cout<<"Enter password."<<endl;
     for (i=0;i<=8;i++)
     {   
         ch=getch();
         parr[i]=ch;
         ch='*';
         cout<<ch;
     }

 string p(parr);

 if (u=="username" && p=="password")
 {
    system("cls");
    cout<<"Welcome!";
    break;
 }

 else
 {
     system("cls");
     cout<<"Username and password entered does not match! Please try again.";
 }
 getch();
   }    
     getch();  
    }  

Кроме того, есть ли способ сделать пароль замаскированным только для символов и, тем не менее, для длины пароля, заданного пользователем в качестве ввода, то есть не только 8 символов слова «пароль», но если пользователь вводит " notapassword", то все символы должны быть замаскированы, а не только первые восемь из них.


person Anchith Acharya    schedule 12.06.2016    source источник
comment
1. [использование пространства имен std является плохим]( stackoverflow.com/questions/1452721/) 2. Для этого используйте библиотеку curses   -  person Ed Heal    schedule 12.06.2016
comment
Я думаю, вы должны научиться отлаживать себя. После того, как вы запустите программу шаг за шагом, даже если вы не найдете проблему самостоятельно, вы, вероятно, сможете задать более точный вопрос, на который будет легче ответить.   -  person selalerer    schedule 12.06.2016
comment
Проклятия @EdHeal? В Windows?   -  person melpomene    schedule 12.06.2016
comment
Где упоминаются окна в вопросе?   -  person Ed Heal    schedule 12.06.2016
comment
@EdHeal <conio.h>, getch(), system("cls")   -  person melpomene    schedule 12.06.2016
comment
Но «использование пространства имен std» является обязательным в dev C++, насколько я знаю.   -  person Anchith Acharya    schedule 12.06.2016
comment
@melpomene - Возможно, кстати, getch является частью проклятий. cls может быть командой UNIX (у меня есть одна настроенная). conio,h может быть любым заголовочным файлом,   -  person Ed Heal    schedule 12.06.2016
comment
@AnchithAcharya - Нет, это не так   -  person Ed Heal    schedule 12.06.2016
comment
@selalerer Я только что понял, что даже не знаю, что такое отладка! Когда я нажимаю отладку после компиляции, она просто запускает программу. И вот я погружаюсь в массивы и сложные программы входа в систему!   -  person Anchith Acharya    schedule 12.06.2016
comment
@AnchithAcharya Я не знаю, какой инструмент разработки вы используете (Visual Studio?), в любом случае вы всегда можете выполнить отладку Google с помощью [УКАЖИТЕ ЗДЕСЬ НАЗВАНИЕ СРЕДСТВА РАЗРАБОТКИ].   -  person selalerer    schedule 12.06.2016
comment
Это Dev C++. И спасибо, я проверю.   -  person Anchith Acharya    schedule 12.06.2016
comment
parr[i] - это массив char из 1 элемента, и вы заполняете его 8 chars. string (const char* s) создает строку из строки c с нулевым завершением, и вы не инициализируете parr.   -  person perencia    schedule 12.06.2016
comment
@perencia Но в цикле for по мере увеличения значения «i» размер массива не увеличивается с каждым шагом? Кроме того, не могли бы вы объяснить в терминах непрофессионала, что вы сказали во втором предложении?   -  person Anchith Acharya    schedule 12.06.2016


Ответы (2)


Некоторые операционные системы уже предоставляют функцию getpass или ее расширенные версии. Например, NetBSD реализация здесь, документация здесь. Прочитайте этот код, если вам нужно реализовать функцию самостоятельно.

person Roland Illig    schedule 12.06.2016

Почему вы не распечатали значение p перед тем, как задать этот вопрос?

Вы создаете массив с именем parr, который заполняется случайными данными. (Некоторые компиляторы будут заполнять массив известными ненулевыми данными, но это различается между компиляторами и между разными режимами каждого компилятора).

Ваш массив имеет длину 0 байт. (На самом деле создание массива, размер которого задается переменной, не разрешено стандартным C++).

Вы получаете 9 символов с клавиатуры и последовательно записываете их в 0-байтовый массив parr.

Затем вы создаете строку с именем p на основе символов, начинающихся с parr[0] и продолжающихся до тех пор, пока не будет найден символ с нулевым значением. Поскольку вы никогда не записывали в массив нулевой символ, это означает, что p будет содержать введенные символы, за которыми следует неизвестное количество неизвестных символов, в зависимости от того, что окажется в памяти компьютера после начала parr. Это может быть ноль байтов (так что вы получите 9-символьную строку в p) или это может быть миллион байтов, или программа может рухнуть, потому что она попадет в несуществующую память раньше, если найдет символ, значение которого равно нулю.

Затем вы сравниваете строку, содержащую не менее 9 символов, с паролем длиной 8 символов. Конечно, никогда не совпадет.

person nugae    schedule 12.06.2016
comment
Не могли бы вы предложить, что я могу сделать, чтобы исправить это? - person Anchith Acharya; 12.06.2016