文字列が重複してはまずいのでしょうから、それをよけてやる必要があると思います。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;
}
お礼
ありがとうございました。 プログラム内で分からない部分がありましたが、 勉強になりました。