Я сделал функцию для ввода логина/пароля и хотел, чтобы пароль скрывался звездочками, а выводились бы логин и пароль в формате 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;
}
#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;
}
Вот такую модификацию Вашего кода я предлагаю, теперь объясню в деталях построчно:
Некоторые заголовочные файлы я убрал, они не нужны. Добавилась директива #include <vector> - этот заголовок предоставляет возможность работы с последовательным контейнером std::vector. О нем Вы можете прочитать, например, здесь и здесь.
Я убрал using namespace std;. Когда будете писать большие проекты, у Вас будет много пространств имен и Вы поймете, что такая вещь, как using namespace, вообще говоря, неудобна. Приучайтесь смолоду;) Пишите std:: перед всем, где требуется.
Аргументы в main необязательны, это я так, по привычке. EXIT_SUCCESS = 0.
Переходим к рассмотрению функции void sign_in():
login теперь имеет тип std::string. Все-таки на C++ пишем, отвыкайте от массивов, строк в C-стиле. Они менее безопасны;) Прочитать о типе string можно здесь и здесь.
password - массив типа vector, хранящий char-ы. Изначально массив пуст.
password.push_back(c); добавление нового символа пароля в конец массива.
std::size_t - целочисленный тип данных, можно написать просто int i = 0.
Что касается Вашего кода, то вот таким образом char *pass = new char[0]; Вы создаете динамический массив на 0 элементов типа char. Записывать туда что-то, мягко говоря, не очень хорошо. И потом, раз вы создали массив посредством оператора new[], то удалите его с помощью delete[]. Также могу добавить, что современный C++ позволяет почти полностью (если не совсем) отказаться в клиентском коде от использования обычных указателей. А заменяются они т.н. интеллектуальными указателями (изучите их).
Еще немного не понял Ваш комментарий относительно сокрытия пароля. Если Вы хотите, чтобы даже звездочек не было, то можете сделать так _putch(' '); вместо _putch('*'); и будут у Вас пробелы печататься. Плюс можно сделать, чтобы еще и курсор не сдвигался.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости