Сокрытие символов при вводе пароля

379
11 ноября 2017, 13:27

Я сделал функцию для ввода логина/пароля и хотел, чтобы пароль скрывался звездочками, а выводились бы логин и пароль в формате login:password. Но в конце выводится и мусор - лишние символы - см. скриншоты консоли. Почему это происходит? Как избавиться от этого?

Вопросы: как лучше сохранять пароль, не отображать его при вводе и создать массив с размером, равным кол-ву символов в пароле? Как возможно реализовать это на C++?

Вот код:

#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
void sign_in() {
    const int n = 50;
    char login[n];
    char *pass = new char[0];
    char c;
    int i = 0;
    std::cout << "Your login: ";
    std::cin.getline(login, n);
    std::cout << "Your password: ";
    while ((c = _getch()) != '\r')
    {
        pass[i++] = c;
        _putch('*');
    }
    std::cout << endl << login << ":" << pass << endl;
}
int main(){
    sign_in();
    return 0;
}

Answer 1
#include <conio.h>
#include <string>
#include <iostream>
#include <vector>
void sign_in() 
{
    std::string       login;
    std::vector<char> password;
    char c;
    std::cout << "Enter login: ";
    std::cin >> login;
    std::cout << "Enter password: ";
    while ((c = _getch()) != '\r')
    {
        password.push_back(c);
        _putch('*');
    }
    std::cout << std::endl << login << " : ";
    for (std::size_t i = 0; i < password.size(); ++i)
        std::cout << password[i];
    std::cout << std::endl;
}
int main(int argc, char* argv[])
{
    sign_in();
    return EXIT_SUCCESS;
}

Вот такую модификацию Вашего кода я предлагаю, теперь объясню в деталях построчно:

  1. Некоторые заголовочные файлы я убрал, они не нужны. Добавилась директива #include <vector> - этот заголовок предоставляет возможность работы с последовательным контейнером std::vector. О нем Вы можете прочитать, например, здесь и здесь.

  2. Я убрал using namespace std;. Когда будете писать большие проекты, у Вас будет много пространств имен и Вы поймете, что такая вещь, как using namespace, вообще говоря, неудобна. Приучайтесь смолоду;) Пишите std:: перед всем, где требуется.

  3. Аргументы в main необязательны, это я так, по привычке. EXIT_SUCCESS = 0.

Переходим к рассмотрению функции void sign_in():

  1. login теперь имеет тип std::string. Все-таки на C++ пишем, отвыкайте от массивов, строк в C-стиле. Они менее безопасны;) Прочитать о типе string можно здесь и здесь.

  2. password - массив типа vector, хранящий char-ы. Изначально массив пуст.

  3. password.push_back(c); добавление нового символа пароля в конец массива.

  4. std::size_t - целочисленный тип данных, можно написать просто int i = 0.

Что касается Вашего кода, то вот таким образом char *pass = new char[0]; Вы создаете динамический массив на 0 элементов типа char. Записывать туда что-то, мягко говоря, не очень хорошо. И потом, раз вы создали массив посредством оператора new[], то удалите его с помощью delete[]. Также могу добавить, что современный C++ позволяет почти полностью (если не совсем) отказаться в клиентском коде от использования обычных указателей. А заменяются они т.н. интеллектуальными указателями (изучите их).

Еще немного не понял Ваш комментарий относительно сокрытия пароля. Если Вы хотите, чтобы даже звездочек не было, то можете сделать так _putch(' '); вместо _putch('*'); и будут у Вас пробелы печататься. Плюс можно сделать, чтобы еще и курсор не сдвигался.

READ ALSO
Проверка наличия символа в строке C++

Проверка наличия символа в строке C++

Задача такова: необходимо ввести символ и проверить к какому алфавиту и регистру он принадлежитС латинскими буквами все нормально,но проблемы...

310
Строгий алиасинг в MinGW-w64

Строгий алиасинг в MinGW-w64

При компиляции с MinGW-w64 этого простого кода:

270
Код на С++ который делает реверс звука [требует правки]

Код на С++ который делает реверс звука [требует правки]

Может ктото имет код на С++ в котором есть функция которая делает реверс звука, переключает канал с правого на левыйНужно чтоб изменялся канал...

255
QFutureWatcher и ожидание main потока QT

QFutureWatcher и ожидание main потока QT

Приветствую! Волнует одна большая для меня проблема которую никак не получается решитьРечь идет о многопоточности а именно пытаюсь реализовать...

289