ページ 11

修正お願いします

Posted: 2015年1月21日(水) 16:41
by 学生
乱数を利用して16進数で8桁のpasswordを作成したいのですが、このプログラムに乱数をどうやっていれれば良いかわかりません。
digi.txtファイルは
1 1 1
1 0 1
1 0 1
1 0 1
1 1 1

0 0 1
0 1 1
0 0 1
0 0 1
0 0 1

以下省略・・・
となっています。どうかよろしくお願いします。

#include <stdio.h>

unsigned long pass[5] = { 0x20150115, 0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210 };

void fout_digit_row( FILE *fp, int *pat )
{
int i;
for( i = 0; i < 3; i++ ){

if( pat == 1 )

{

fprintf( fp, "●" );
}

else{

fprintf( fp, " " );

}

}
return;
}

void fout_digits( FILE *fp, int (*pat)[5][3], unsigned long digits )
{
int i, j;
for( i = 0; i < 5; i++ ){
for( j = 0; j < 7 ; j++ ){

fout_digit_row( fp, pat[0x0f & (digits >> ((7 - j) * 4))] );
fprintf( fp, " " );
}

fout_digit_row( fp, pat[0x0f & digits] );
fprintf( fp, "\n" );
}
return;
}


int main()
{
FILE *fp1, *fp2;

fp1 = fopen( "digi.txt" , "r" );
if( fp1 != NULL ){

fp2 = fopen( "fairu.txt", "w" );
if( fp2 != NULL ){
int num[16][5][3];
int i, j;

for( i = 0; i < 16; i++ ){
for( j = 0; j < 5; j++ ){

char c0, c1, c2;
if( fscanf( fp1 , "%c %c %c\n", &c0, &c1, &c2 ) != EOF ){
num[j][0] = c0 - '0';
num[j][1] = c1 - '0';
num[j][2] = c2 - '0';
}
}
}

for( i = 0; i < 5; i++ ){

fout_digits( stdout, num, pass );
fprintf( stdout, "\n" );
fout_digits( fp2, num, pass );
fprintf( fp2, "\n" );
}
return;
}

fclose( fp2 );
}
fclose( fp1 );
return 0;
}

Re: 修正お願いします

Posted: 2015年1月21日(水) 21:26
by みけCAT
コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。

まず、「0以上0xffffffff (4294967295)以下の整数の乱数を1個取得し、表示する」プログラムは書けますか?
標準関数のrand()は範囲が環境依存なので、XorshiftまたはMersenne Twisterを用いるといいでしょう。
また、int型やlong型の範囲はC言語では環境依存なので、C99が使えるのであればuint32_t型を用いるといいでしょう。