2017-02-08 4 views
1

Мне поручено создать решение, которое будет генерировать безопасный пароль для пользователя. мне нужно ...Ранжирование массива символов для отображения случайного пароля

  1. Подскажите пользователю на длину пароля, количество специальных символов вместе с количеством цифр.

    Пароль должен генерироваться случайным образом с использованием этих входов.

, например, выход:

Что длина пароля? 8

Сколько специальных символов? 2

Сколько номеров? 2

Ваш пароль: aun2 $ 1s #

Мой уровень программирования находится на стадии новичка здесь и пример того, что я сделал до сих пор

#include <iostream> 
#include <algorithm> 
using namespace std; 

void WorkoutPass(int ,int,int); 

int passlength; 
int specChar; 
int number; 


int main() 
{ 
    cout << "Enter the length of password: "; 
    cin >> passlength; 


if (passlength > 0) 
{ 
     cout << "Enter the amount of special characters: "; 
     cin >> specChar; 
     if (specChar > passlength) 
     { 
      cout << "Error - invalid value entered is above the length of password"; 
     } 
     cout << "Enter amount of numbers"; 
     cin >> number; 
     if (number > passlength) 
     { 
      cout << "Error - invalid value entered is above the length of password"; 
     } 
     WorkoutPass(passlength, specChar, number); 

} 
else 
{ 
    cout << "Error - invalid value entered password must be above zero"; 
} 
return 0; 
} 


void WorkoutPass(int p, int s, int n) 
{ 
string password; 

char alphaBetArray[26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 
char specCharArray[10] = {'!','£','$','%','&','@','~','#','>','<'}; 
char numberArray[10] = {'1','2','3','4','5','6','7','8','9','10'}; 


int numberOfLetters = p - s - n; 


char letter; 

// generate (numberOfLetters) letters 

// each letter generated we add to the string 
password += letter; 

// Add special characters 
// Add numbers 



random_shuffle(password.begin(), password.end()); 

cout << password.c_str() << endl; 
} 
void DisplayPass() 
{ 

} 
+0

'' 10'' является юкки. Вы имели в виду ''0''? – Bathsheba

+0

да, извините, просто обратите внимание, что – Cerberus

+0

@Bathsheba Кстати, '£' также является широким персонажем, поэтому в зависимости от вашего языка, который, вероятно, тоже должен быть заменен. –

ответ

0

Вы «просто» пропустить случайную часть поколения, которое вы можете получить с помощью функции rand. Так что в вашем случае это будет:

for (int i=0; i<numberOfLetters; i++) 
    password += alphaBetArray[rand()%sizeof(alphaBetArray)]; 
for (int i=0; i<s; i++) 
    password += specCharArray[rand()%sizeof(specCharArray)]; 
for (int i=0; i<n; i++) 
    password += numberArray[rand()%sizeof(numberArray)]; 

Обязательно проверьте на входе также суммы специальных символов и цифр, теперь вы просто проверить отдельные записи, но кто-то мог бы поставить: 10 (длина пароля), 6 (специальные символы), 7 (цифры), и это плохо.

+2

[STL] (https://channel9.msdn.com/Events/Speakers/Stephan-T-Lavavej) говорит о том, почему «rand» является плохим вариантом после [tag: C++ 11]: https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful –

1

представила sample Какие вы хотите использовать вместе с random_shuffle вы уже на месте для создания password:

random_device rd; 
mt19937 g(rd()); 
auto it = sample(cbegin(alphaBetArray), cend(alphaBetArray), begin(password), numberOfLetters, g); 

it = sample(cbegin(specCharArray), cend(specCharArray), it, s, g); 
sample(cbegin(numberArray), cend(numberArray), it, n, g); 

Live Example


Пара отмечает:

  1. Ваши массивы не являются исчерпывающими, написание лямбда случайным образом генерировать символы в диапазоне может быть предпочтительным вариантом, вы можете сделать это с помощью generate_n.
  2. random_shuffle осуждался в вам нужно использовать shuffle Теперь
0
  1. Генерировать случайные р CHARS

  2. Генерировать s специальные символы

  3. Генерация случайных чисел п

  4. Соединить их и перетасовать их

string workout_pass(int p, int s, int n) 
{ 
    string password; 

    const char alphaBetArray[26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 
    const char specCharArray[10] = {'!','£','$','%','&','@','~','#','>','<'}; 
    const char numberArray[10] = {'1','2','3','4','5','6','7','8','9','10'}; 


    int numberOfLetters = p - s - n; 

    for (i = 0 ; i < numberOfLetters; ++i) { 
    password += alphaBetArray[rand() % 26]; 
    } 

    for (i = 0 ; i < s; ++i) { 
    password += specCharArray[rand() % 10]; 
    } 

    for (i = 0 ; i < n; ++i) { 
    password += numberArray[rand() % 10]; 
    } 

    random_shuffle(password.begin(), password.end()); 

    return password; 
} 

Некоторых комментарии:

  1. Поскольку это функция, лучше не использовать верблюжий
  2. Поскольку это функция лучше вернуть сгенерированную строку, а не пустое
  3. Пытаться избавиться от массивы char и играть с номерами ascii (например, 97 + (rand()% 26)) для [az]
  4. Последнее, но не менее важное использование C с этими проблемами не C++/STL функции, такие как random_shuffle, и попытаться достичь того же результат, вы узнаете лучше всего
+0

[STL] (https://channel9.msdn.com/Events/Speakers/Stephan-T-Lavavej) о том, почему «rand» '- плохой вариант после [tag: C++ 11]: https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful –

+0

Не понимаю, зачем использовать слишком сложные решения для простого проблема, снова он мог бы дойти до крайности и использовать Мерсенн Твистер с поразительным периодом 2^19937-1, будет ли он видеть какую-либо разницу в его упражнении? Неа. Контекст людей. – stevengatsios

+0

Я связал видео, чтобы вы могли * понять почему. 'rand' следует использовать только в контексте pre- [tag: C++ 11]. Какой OP не использует, он называет 'random_shuffle'. Что касается вашего вопроса: «Он увидит разницу?» Ответ - да. И, конечно же, да, если вы не засеваете свой «ранд». –

 Смежные вопросы

  • Нет связанных вопросов^_^