не присваиваются значения в массив
#include <iostream>
#include <random>
#include <string>
using namespace std;
using std::string;
std::random_device rd;
// Функции
string generate_password(size_t len = 7) // генерация кода доступа
{
string res;
while (len--)
res += '0' + rd() % 10;
return res;
}
string change_generate_password(string pass) // генерация нового кода доступа
{
for (auto& ch : pass)
ch = '0' + ((ch - '0') + 1) % 10;
return pass;
}
int main()
{
setlocale(LC_ALL, "Russian");
// Переменные
string login,last_login, name, password, new_password, last_password,code,last_code,new_code;
int menu, count_, change_password;
count_ = 0;
change_password = 0;
int number = 0;
int const SIZE = 100;
//int i = 0;
int value = 0;
// массивы
string all_login[SIZE];
string all_password[SIZE];
string all_code[SIZE];
/*
string *all_login = new string[SIZE]; // логины
string* all_password = new string[SIZE]; // пароли
string* all_code = new string[SIZE]; // одноразовые пароли(Коды)
*/
// Меню
while (true)
{
cout <<"Выберите нужное действие:\n"
<<"1. Регистрация\n"
<<"2. Авторизация\n"
<<"3. Смена пароля\n"
<<"4. Выход\n";
cin >> menu;
switch (menu)
{
// Регистрация
case 1:
cout << "Добро пожаловать в меню регистрации!!!" << endl;
cout << "Введите логин: ";
cin >> login;
last_login = login;
password = generate_password();
last_password = password;
cout << "Введите ваше имя: ";
cin >> name;
code = generate_password(); // генерируется одноразовый код доступа
last_code = code;
cout << "Ваш логин: " << login
<< "\nВаш пароль: " << password
<<"\nВаш одноразовый код доступа: "<< code << endl << endl;
change_password++;
for (int i= 0; value < 1; i++)
{
all_login[i] = login;
all_password[i] = password;
all_code[i] = code;
value++;
}
break;
// Авторизация
case 2:
while (true)
{
cout << "Введите ваш логин: ";
cin >> login;
cout << "Введите ваш пароль: ";
cin >> password;
cout << "Введите ваш код доступа: ";
cin >> code;
int b = 0;
for (; b < SIZE; b++)
{
if (login == all_login[b])
{
cout << b;
continue;
}
}
if (login == all_login[b] && password == all_password[b] && code == all_code[b])
{
cout << "Здравствуйте! " << name << endl;
code = change_generate_password(last_code);
last_code = code;
all_code[b] = code;
break;
}
else
{
cout << "Логин или пароль не верный!\n"<<endl;
count_++;
if (count_ > 3)
{
cout << "Смените пароль!\n";
count_ = 0;
//break;
}
}
break;
}
break;
// Смена пароля
case 3:
if (change_password > 0)
{
new_password = change_generate_password(password);
if (new_password != last_password)
{
password = new_password;
last_password = password;
cout << "Ваш пароль успешно сменен!\n"
<< "Ваш логин: " << login
<< " \nВаш пароль: " << password<<endl<<endl;
}
else
{
cout << "новый пароль не должен быть похож на старый!!!" << endl<<endl;
}
}
else
{
cout << "Вы еще не зарегестрированны!!!" << endl<<endl;
menu = 1;
}
break;
// Выход
case 4:
/*
delete [] all_login;
delete [] all_password;
delete [] all_code;
*/
return 0;
default:
cout << "Такого пункта в меню нет попробуйте еще раз";
break;
}
}
}
Всем привет такая проблема. Во-общем нам нужно хранить в массивах данные пользователей как я планировал это сделать.
- Вводим данные логин и имя , пароль и одноразовый код генерируются сами
- Записываем логин пароль и код в разные динамические массивы под один индекс
- получаем номер индекс логина и по этому индексу сравниваем все остальные данные
Ответы (1 шт):
Ну тут достаточно ошибок.
Во первых вы вносите всего 1 значение в массивы под индексом 0 - потому что в цикле условие на выход for( int i=0; value < 1; i++)
int value = 0;
....
for (int i= 0; value < 1; i++)
{
all_login[i] = login;
all_password[i] = password;
all_code[i] = code;
value++;
}
Видимо value - это количество записей в массиве. Тогда должно быть так:
int value = 0;
....
case 1:
all_login[value] = login;
all_password[value] = password;
all_code[value] = code;
value++;
А при авторизации у вас вообще выход за пределы массива. Первый цикл завершается, когда b==SIZE. Видимо вы при совпадении логина хотели выйти из цикла, но тогда надо было использовать break;. А дальше в операторе if() вы адресуете массив по значению b, т.е. фактически вы обращаетесь к элементу all_login[SIZE] - а это уже за пределами массива. А в теле условного оператора ещё и присваиваете значение!
case 2:
int b = 0;
for (; b < SIZE; b++)
{
if (login == all_login[b])
{
cout << b;
continue; // видимо здесь подразумевался break;
}
}
if (login == all_login[b] && password == all_password[b] && code == all_code[b]) // выход за пределы массива
{
all_code[b] = code; // выход за пределы массива
break;
}
При смене пароля вы затираете старое значение пароля. У вас и last_password и password равны одному значению. Чтобы этого не было, поменяйте строки местами.
if (new_password != last_password)
{
password = new_password;
last_password = password;
Также при смене пароля вы его как-бы сменили, вот только в массив паролей не записали. И какой именно пароль вы меняете? От какой учетной записи?