プロが教える店舗&オフィスのセキュリティ対策術

これをcで書こうとしています。

文字列の文字数は10文字程度、
作る数は1000個程度にしたいと思います。

http://www5.airnet.ne.jp/tomy/cpro/ra3.htm
を参考にして見たのですが、行き詰ってしまいました・・・。

分かる方がいらっしゃいましたら、教えてください。

A 回答 (2件)

文字列が重複してはまずいのでしょうから、それをよけてやる必要があると思います。

ndbmを使って↓の様なのはどうでしょうか?
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <gdbm.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>

char *prog;

void
usage(void)
{
fprintf(stderr, "%s nletter nword\n", prog);
exit(0);
}

int
main(int argc, char *argv[])
{
int i, j, k;
int nletter, nword;
char word[11];
char dbname[80];
GDBM_FILE dbf;
datum content, key;

prog = argv[0];
if (argc < 2) {
usage();
}
nletter = atoi(argv[1]);
nword = atoi(argv[2]);

sprintf(dbname, "/tmp/randword%d", (int) getppid());

if ((dbf = gdbm_open(dbname, 0, GDBM_NEWDB, 0644, NULL)) == NULL) {
fprintf(stderr, "Can(t open dbm %s\n", dbname);
exit(errno);
}
srand((unsigned) time(NULL));

for (k = j = 0; j < nword;) {
for (i = 0; i < nletter; i++) {
word[i] = 'a' + (rand() % 26);
}
word[i] = '\0';

key.dptr = word;
key.dsize = nletter + 1;
content = gdbm_fetch(dbf, key);
if (content.dptr == NULL) {
content.dptr = " ";
content.dsize = 1;
gdbm_store(dbf, key, content, GDBM_INSERT);
j++;
printf("%s\n", word);
}
else
fprintf(stderr, "double=%d\n", ++k);
}
fprintf(stderr, "double=%d\n", k);
unlink(dbname);
return 0;
}
    • good
    • 2
この回答へのお礼

ありがとうございました。
プログラム内で分からない部分がありましたが、
勉強になりました。

お礼日時:2005/11/16 13:10

そのURLはランダム数値生成のアルゴリズムをソースで


解説しているページです。
ランダム数を得る関数はCの標準関数で用意されています。
単純にaからzまでのアルファベットをランダムにだしたいなら

char test = 'a' + (rand() % 26 );
でtestにa~zが入ります。


で10文字作りたいならこんな感じです。

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

int main(){
int i;
char Test[11];
srand( (unsigned)time( NULL ) );
for( i = 0 ; i < 10 ; i++ ){
Test[i] = 'a' + (rand() % 26 );
}
Test[i] = '\0';
printf(Test);
return 0;
}
    • good
    • 3
この回答へのお礼

大変分かりやすいプログラムありがとうございました。
プログラムを少しいじらせてもらい、完成させることが出来ました。

お礼日時:2005/11/16 13:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!