ページ 11

パスワード生成

Posted: 2012年1月15日(日) 16:23
by ゆいー
パスワードをランダムで作る。パスワードは,英字(大文字・小文字)と数字の組み合わせで作らなければならない。
 パスワードの文字数は,6桁から10桁である。
 パスワードの文字数 n と,配布する対象者の人数 m とを入力すると,
 ランダムに作ったn桁のパスワードをm人分,1行に1個ずつ標準出力に出力してくれる
 プログラムを作ってほしい。

 このとき,m人分のパスワードに同じものがあってはならない。
 プログラムは,n と m を引数とする実行指令を標準入力から与える形のもので
 差し支えない。

というプログラムを作りたいのですが、どのような方針を立てて作ればよいでしょうか?
ご指南お願いします。

Re: パスワード生成

Posted: 2012年1月15日(日) 16:29
by みけCAT
課題のような雰囲気ですが?
丸投げは禁止されています。
フォーラムルールをお読みください。

Re: パスワード生成

Posted: 2012年1月15日(日) 18:58
by non
ゆいー さんが書きました:どのような方針を立てて作ればよいでしょうか?
方針?というより、私の考え方ですが、

1 使える文字をすべて、配列に入れる。
2 乱数で、その配列からn文字取って、パスワードを作る。
3 すでに作成されたパスワードかチェックする。
4 m個作る。

すでに作ったパスワードはリストか配列に入れていきます。

Re: パスワード生成

Posted: 2012年1月16日(月) 13:48
by ゆいー
じぶんで試しに作ってみたんですが、

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define rnd(n) (int)(n * (rand() / (RAND_MAX + 1.0)))


char *pass(char *s, size_t n)
{
const char *const a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYG0123456789";
size_t i;

-- n;
for(i = 0; i < n; ++ i) s = a[rnd(62)];
s = '\0';
return s;
}

int main(int argc, char *argv[])
{
int A, B, j;


A= atoi(argv[1]);
B= atoi(argv[2]);
for(j=0; j<B; j++){
char s[A];

srand((unsigned)time(NULL));
puts(pass(s, sizeof s));
}
return 0;
}
以下のように作ったんですが
実行すると./a.out 6 5
m1ugl
m1ugl
m1ugl
m1ugl
m1ugl

のようになってしまい、一つランダムでつくった数値を5個表示するようになってしまいました。
どうかえれば1個1個ランダムで表示できるようになるでしょうか?
お願いします。今回桁数をA,人数をBとしました。

Re: パスワード生成

Posted: 2012年1月16日(月) 14:02
by non
srand((unsigned)time(NULL));
は最初に1回だけやれば良い。forの前に移動のこと。

コードはタグで括ってください。

方法
コードを貼り付けたら、コードをドラッグして選択する。
投稿画面の上にある、-コード- と書かれているコンボボックスをクリックし、cかc++を選択する。
以上

Re: パスワード生成

Posted: 2012年1月16日(月) 23:06
by box
ゆいー さんが書きました:

コード:

    A= atoi(argv[1]);
    char s[A];
実行すると./a.out 6 5
m1ugl
何だか1文字足りないような気がします。

あと、argcの値をチェックしてからargv[]を参照する必要がありそうです。

Re: パスワード生成

Posted: 2012年1月16日(月) 23:16
by beatle
box さんが書きました: 何だか1文字足りないような気がします。

あと、argcの値をチェックしてからargv[]を参照する必要がありそうです。
pass関数の中で
--n
としているので,1文字足りないのは仕様だと思います.

Re: パスワード生成

Posted: 2012年1月16日(月) 23:21
by box
beatle さんが書きました: pass関数の中で
--n
としているので,1文字足りないのは仕様だと思います.
だとすると、その仕様は間違っていると思います。
m1ugl
は、ふつう5文字とカウントすると思います。
ところが、質問者さんの実行画面では、「6文字の」パスワードを生成しようとしています。
この食い違いを、論理的にどう説明すればいいのでしょうか。私には説明できません。