2017-07-12 20 views
-5

私が学んでいるC++を生成し、私は「発電用パスワード」を作成しようとしてきたと私はいくつかの問題を持っている:ここ (int型メイン)ソースです:はランダムなパスワード[C++]

//Declaring Variables 
int PasswordNumbers, PasswordChar; 
char alphabet[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' }; 
string * passwords; 
string password; 

//Message and Input 
cout << "How Many Passwords Should Generate ?" << endl; 
cin >> PasswordNumbers; 

cout << "How Many Letters/Numbers Should be in each Passowrd ?" << endl; 
cin >> PasswordChar; 

passwords = new string[PasswordNumbers]; 

for (int j = 0; j < PasswordNumbers; j++) { //How Many Passwords? 
    for (int i = 0; i < PasswordChar; i++) { //How Many Letters/Numbers? 
     int randomBool = rand() % 2; 
     if (randomBool == 1) { 
      int random = rand() % 10; 
      password.append(to_string(random)); 
     } 
     else { 
      int random = rand() % 26; 
      string randomLetter = to_string(alphabet[random]); 
      password.append(randomLetter); 
     } 
    } 
    passwords[j] = password; 
} 

for (int i = 0; i < passwords->length(); i++) { 
    printf("Random Number: %s \n", passwords[i].c_str()); 
} 

delete[] passwords; 

cmdは、

問題:

  1. 数字のみを生成します。
  2. ユーザーが選択した文字数を生成しません。
  3. 同じ番号を生成しています。

コードは、私には正常に見える、私は間違って何かを参照してくださいカント...

+4

これに最も適したツールは、デバッガです。 – Charles

+1

私はあなたが 'to_string'に' char'を渡すと、あなたが思っていることをしないと思います。 –

+1

srand()を使用して乱数をシードします。そうしないと、実行時に同じ番号が表示されます。擬似乱数を調べる。 – sBanda

答えて

1

charためstd::to_string()のない専門がありませんので、あなただけの番号を取得しています。したがって、to_string(alphabet[random]))を実行すると、charint(文字の文字コードが返されます)に変換され、文字列に変換されます。したがって、to_string('a')"97"であり、"a"ではありません。

配列の代わりに、アルファベットを含む文字列を使用できます。 std::string::append()では、コピー元の部分文字列を指定できます。したがって、次の操作を行うことができます:

string alphabet = "abcdefghijklmnopqrstuvwxyz"; 
int random = rand() % alphabet.size(); 
password.append(alphabet, random, 1); 

これは、パスワードが希望の長さでない理由についても説明しています。文字を追加する場合は、代わりに2桁または3桁の数字を追加します。

最後に、新しいパスワードを生成するたびにpasswordをクリアしないので、古いパスワードに追加されます。これに対する簡単な解決策は、最初のforループ内でstring password;宣言を移動することです。

プログラムの開始時にsrand(time())に電話する必要があります。そのため、実行するたびに異なるパスワードを取得します。それ以外の場合、プログラムは常に同じランダムシードで開始します。

+0

ありがとうございます! – therealcain

関連する問題