Форум программистов, компьютерный форум CyberForum.ru

Генератор паролей (нужна проверка) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
23.11.2011, 17:57     Генератор паролей (нужна проверка) #1
Здравствуйте. Написал простенький генератор паролей задаваемой пользователем длины. Все вроде правильно работает, просто, пожалуйста, посмотрите и скажите, где и почему я мудак.

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
class PasswordGenerator
{
public:
    void askParameters();
    void generate();
    void output();
    
    ~PasswordGenerator();
private:
    int length;
    char *pass;    
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
#include "PasswordGenerator.h"
 
void PasswordGenerator::askParameters()
{
    cout << "Enter length of the password: ";
    cin >> length;
}
 
void PasswordGenerator::generate()
{
    srand( time( 0 ) );
 
    pass = new char[ length ];
    
    const char numbers[ 10 ] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    const char letters[ 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' };
                                 
    int random_array, random_symbol;
    
    for( int i = 0; i < length; i++ )
    {
        random_array = 1 + rand() % 2;
        
        switch( random_array ) {
            case 1:
                pass[ i ] = numbers[ 0 + rand() % 10 ];
                break;
            case 2:
                pass[ i ] = letters[ 0 + rand() % 26 ];
                break;
        }
    }    
}
 
void PasswordGenerator::output()
{
     for( int i = 0; i < length; i++ )
         cout << pass[ i ];
         
     cout << endl;
}
 
PasswordGenerator::~PasswordGenerator()
{
    delete [] pass;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <conio.h>
#include "PasswordGenerator.h"
 
int main()
{
    PasswordGenerator password;
 
    password.askParameters();
    password.generate();
    password.output();
    
    password.~PasswordGenerator();
 
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2011, 17:57     Генератор паролей (нужна проверка)
Посмотрите здесь:

генератор паролей C++
C++ Генератор паролей
генератор паролей C++
C++ генератор уникальных паролей
Генератор паролей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
23.11.2011, 18:17     Генератор паролей (нужна проверка) #2
Цитата Сообщение от vortexx1 Посмотреть сообщение
PasswordGenerator::~PasswordGenerator()
{
delete [] pass;
}
А если память не выделялась?

Добавлено через 1 минуту
Цитата Сообщение от vortexx1 Посмотреть сообщение
void PasswordGenerator::askParameters()
{
cout << "Enter length of the password: ";
cin >> length;
}
Цитата Сообщение от vortexx1 Посмотреть сообщение
void PasswordGenerator::output()
{
for( int i = 0; i < length; i++ )
cout << pass[ i ];
cout << endl;
}
Внутри класса ввод\вывод лучше не делать.

Добавлено через 42 секунды
А где конструктор по умолчанию?
Если не вызвать метод askParametrs, то не правильно будут работать остальные методы.
Добавлено через 2 минуты
Цитата Сообщение от vortexx1 Посмотреть сообщение
password.~PasswordGenerator();
При выходе из области действия, т.е. из блока, деструктор сам вызовется.
Поэтому у вас 2 раза вызовется деструктор, что приведет к ошибке.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
23.11.2011, 18:27     Генератор паролей (нужна проверка) #3
Цитата Сообщение от vortexx1 Посмотреть сообщение
void PasswordGenerator::askParameters() { cout << "Enter length of the password: "; cin >> length; }
плохо внутри метода.

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

Добавлено через 1 минуту
чё будет если у твоего кода убрать вызов generate?

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   const char numbers[ 10 ] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    const char letters[ 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' };
                                 
    int random_array, random_symbol;
    
    for( int i = 0; i < length; i++ )
    {
        random_array = 1 + rand() % 2;
        
        switch( random_array ) {
            case 1:
                pass[ i ] = numbers[ 0 + rand() % 10 ];
                break;
            case 2:
                pass[ i ] = letters[ 0 + rand() % 26 ];
                break;
        }
    }
бред...

аналогично:
C++
1
2
3
4
static char a[]="1234567890qwertyuiopasdfghjklzxcvbnm";
static int l = strlen(a);
for (int i=0; i<length; i++)
pass[i]=rand()%l;
ну возможно есть скрытый смысл разделения букв и цифр, но зачем?
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
23.11.2011, 18:27  [ТС]     Генератор паролей (нужна проверка) #4
Цитата Сообщение от OstapBender Посмотреть сообщение
чё будет если у твоего кода убрать вызов generate?
Ерунда получится (
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
23.11.2011, 18:33     Генератор паролей (нужна проверка) #5
еще 1 + конструктору - а если я забыл вызвать askParameters , то что выполнит generate?

Цитата Сообщение от vortexx1 Посмотреть сообщение
"Ничё", в том и соль, что длину спрашивать у пользователя.
это врятли. ты проверь и увидишь. закоментируй эту строчку.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.11.2011, 18:35     Генератор паролей (нужна проверка) #6
vortexx1, плохой дизайн.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
23.11.2011, 18:40  [ТС]     Генератор паролей (нужна проверка) #7
Цитата Сообщение от fasked Посмотреть сообщение
vortexx1, плохой дизайн.
Не понял шутки )
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.11.2011, 18:46     Генератор паролей (нужна проверка) #8
Цитата Сообщение от vortexx1 Посмотреть сообщение
Не понял шутки
Я не шучу. Ваш классно отвратительно спроектирован:
  • Использование стандартных потоков ввода/вывода в методах.
  • Потенциальная ошибка при работе с динамической памятью.
  • Вообще работа с динамической памятью в открытом виде как факт.
  • Невозможность устанавливать/удалять дополнительные символы (алфавиты) для генерации пароля.
  • Невозможность получить сгенерированный пароль в виде самостоятельного объекта.
  • Функция srand вызывается каждый раз, а должна только единожды.
Все, что я смог заметить с первого беглого взгляда.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
23.11.2011, 18:58  [ТС]     Генератор паролей (нужна проверка) #9
Сделал так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class PasswordGenerator
{
public:
    PasswordGenerator( int = 0, char * = 0 );   
       
    void generate();
    char output( int );
    
    int getLength();
    
    ~PasswordGenerator();
private:
    int length;
    char *pass;    
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
 
#include "PasswordGenerator.h"
 
PasswordGenerator::PasswordGenerator( int len, char *passw )
                                      : length( len ), pass( passw )
{
     srand( time( 0 ) );
     
     const int min = 10, max = 25;
     length = min + rand() % max;
}
 
void PasswordGenerator::generate()
{
    pass = new char[ length ];
    
    const char array[] = "1234567890qwertyuiopasdfghjklzxcvbnm";
    int array_len = strlen( array );
    
    for( int i = 0; i < length; i++ )
        pass[ i ] = array[ 0 + rand() % array_len ];
}
 
char PasswordGenerator::output( int number )
{
     return pass[ number ];
}
 
int PasswordGenerator::getLength()
{
    return length;     
}
 
PasswordGenerator::~PasswordGenerator()
{
    if( length > 0 )
       delete [] pass;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <conio.h>
#include <iostream>
using namespace std;
 
#include "PasswordGenerator.h"
 
int main()
{
    PasswordGenerator password;
 
    password.generate();
    
    for( int i = 0; i < password.getLength(); i++ )
        cout << password.output( i );
    
    getch();
    return 0;
}
Можно подробней насчёт этого:
Невозможность получить сгенерированный пароль в виде самостоятельного объекта.
?
Как это исправить?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
23.11.2011, 19:04     Генератор паролей (нужна проверка) #10
Цитата Сообщение от vortexx1 Посмотреть сообщение
#include "PasswordGenerator.cpp"
оО втф?

Цитата Сообщение от vortexx1 Посмотреть сообщение
PasswordGenerator password;
пароль длиной 0 символов?

Цитата Сообщение от vortexx1 Посмотреть сообщение
password.generate();
скажи честно пробывал убирать ету строчку?

Цитата Сообщение от vortexx1 Посмотреть сообщение
for( int i = 0; i < password.getLength(); i++ ) cout << password.output( i );
о боги...
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
23.11.2011, 19:09  [ТС]     Генератор паролей (нужна проверка) #11
Цитата Сообщение от OstapBender Посмотреть сообщение
#include "PasswordGenerator.cpp"
оО втф?
Очепятка, исправил.

Цитата Сообщение от OstapBender Посмотреть сообщение
PasswordGenerator password;
пароль длиной 0 символов?
В конструкторе же стоит от 10 до 25. (Правда хз зачем тогда по умолчанию ставил длину = 0).


Цитата Сообщение от OstapBender Посмотреть сообщение
password.generate();
скажи честно пробывал убирать ету строчку?
Да, вылетает. Как исправить?


Цитата Сообщение от OstapBender Посмотреть сообщение
for( int i = 0; i < password.getLength(); i++ ) cout << password.output( i );
о боги...
Как ещё можно вытащить массив из объекта кроме как так? (цензура, согласен)

 Комментарий модератора 
В теме про шахматы я предупреждал.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
23.11.2011, 19:20     Генератор паролей (нужна проверка) #12
Цитата Сообщение от vortexx1 Посмотреть сообщение
В конструкторе же стоит от 10 до 25. (Правда хз зачем тогда по умолчанию ставил длину = 0).
пусть в кач-ве параметра принимает len

Цитата Сообщение от vortexx1 Посмотреть сообщение
Да, вылетает. Как исправить?
поместить выделение памяти в конструктор

Цитата Сообщение от vortexx1 Посмотреть сообщение
Как ещё можно вытащить массив из объекта кроме как так?
возвращать const char* как вариант

можно действительно сделать пароль в виде отдельного класса.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
23.11.2011, 19:45     Генератор паролей (нужна проверка) #13
Цитата Сообщение от OstapBender Посмотреть сообщение
можно действительно сделать пароль в виде отдельного класса.
Или просто пароль сделать типом std:string, а класс генерации пароля сделать отдельной функцией, которая принимает только длину, а возвращает std::string.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
23.11.2011, 20:26  [ТС]     Генератор паролей (нужна проверка) #14
Переписал всё на такое:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string>
using std::string;
 
class PasswordGenerator
{
public:
    PasswordGenerator( int = 0, string = 0 );   
       
    void generate();
    string output();
    
private:
    int length;
    string pass;   
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
 
#include "PasswordGenerator.h"
 
PasswordGenerator::PasswordGenerator( int len, string passw )
                                      : length( len ), pass( passw )
{
     srand( time( 0 ) );
     
     const int min = 10, max = 25;
     length = min + rand() % max;
}
 
void PasswordGenerator::generate()
{
    const char array[] = "1234567890qwertyuiopasdfghjklzxcvbnm";
    int array_len = strlen( array );
    
    for( int i = 0; i < length; i++ )
        pass[ i ] = array[ 0 + rand() % array_len ];
}
 
string PasswordGenerator::output()
{
    return pass;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <conio.h>
#include <iostream>
#include <string>
using namespace std;
 
#include "PasswordGenerator.h"
 
int main()
{
    PasswordGenerator password;
 
    password.generate();
    cout << password.output();
    
    getch();
    return 0;
}
, но программа открывается и сразу закрывается (как будто я не написал getch() ). Что не так?
Использую Dev-C++.

Добавлено через 17 минут
Кто-нибудь!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.11.2011, 21:08     Генератор паролей (нужна проверка) #15
vortexx1, Код не корректен. Неверная работа с string.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
23.11.2011, 21:15  [ТС]     Генератор паролей (нужна проверка) #16
А как исправить, чтоб всё было нормально? Компилятор не ругается, странно...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2011, 21:30     Генератор паролей (нужна проверка)
Еще ссылки по теме:

C++ Генератор паролей
Создать генератор паролей в котором можно указать длину пароля и количество паролей C++
C++ Генератор паролей

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.11.2011, 21:30     Генератор паролей (нужна проверка) #17
C++
1
    PasswordGenerator( int = 0, string = 0 );
Во первых. Какого фига здесь попытка присвоить строке инт?
C++
1
2
3
4
5
6
7
8
PasswordGenerator::PasswordGenerator( int len, string passw )
                                      : length( len ), pass( passw )
{
     srand( time( 0 ) );
     
     const int min = 10, max = 25;
     length = min + rand() % max;
}
Хорошо. Но под строку-то память не выделена. Создалась пустая строка в итоге.

C++
1
2
    for( int i = 0; i < length; i++ )
        pass[ i ] = array[ 0 + rand() % array_len ];
Ну вот и как мы пытаемся бегать по пустой строке?

Добавлено через 11 минут
Хотя вообщем-то присваивается даже не int... int приводится к char* и строке подается в конструктор нулевой указатель. Не стоит.
Yandex
Объявления
23.11.2011, 21:30     Генератор паролей (нужна проверка)
Ответ Создать тему
Опции темы

Текущее время: 13:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru