0

ねえ、私は一生懸命苦労しています。ランダムな文字列 (長さ 2 から 6) を作成し、「A」から「Z」までのランダムな文字を生成する必要があります。問題は、char* を含む構造体を使用しようとしていることです。次に、ランダムデータを生成しようとすると、各構造体を動的に割り当てます。

struct TStruct 
{ 
int ID; 
float Value; 
int a[4]; 
char *Name; 
};

//create pointer to TSruct
typedef struct TStruct *ptrStruct;

//have ptrStruct point to 10 structs
ptrStruct structs[NUM_STRUCTS];

void genStruct(ptrStruct *alpha, int countID){
//declare variables
//ID counter
countID+=1;
int i;
int temp;
int tempChar;
int nameSize;
*alpha = (ptrStruct)malloc(sizeof(struct TStruct)); 
srand(time(0));
//put the ID in
(*alpha)->ID=countID;
//random number 0 to 999.99 
(*alpha)->Value= (float)rand()/((float)(RAND_MAX)+1000)/100;
//store 4 ints 0 to 100 into array a
for (i = 0; i < 4; i++) {
    //generate random number
    temp = rand() % 100;
    //put into the array
    (*alpha)->a[i] = temp;
}
//generate a random length for the name 2 to 6
nameSize = rand() % 4 + 2;
char buffer[2];
//run a for loop based on the size of nameSize
//THIS IS THE PROBLEM CODE!!!
for (i = 0; i < nameSize; i++) {
    snprintf(buffer,2, "%d",(rand() % 25)+65);
    strcat((*alpha)->Name,buffer);
}
}

どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

0

主な問題の 1 つは、文字列にスペースを割り当てていないことです。char *Name構造体に未初期化があります。

率直に言って、6 文字 (場合によっては 8 文字) の場合は、配列を構造の一部として単純に割り当てる必要があります。64 ビット マシンでは、ポインターは配列よりも大きくなります。32 ビット マシンでは、データだけでなく、ポインタとデータでより多くのスペースを使用することになります。

あなたのキャラクター生成ループも不安定です。このrand()式は多かれ少なかれ妥当ですが (「Z」は生成されず、アルファベットの先頭に偏ります)、'A'65 の代わりに使用し、名前の関連する位置に文字を割り当てる必要があります。 . そのように使用snprintf()すると、各文字のコードの 10 の桁が取得されますが、これはまったく必要ありません。

文字列を null で終了することを忘れないでください。strcat()また、文字列がすでに null で終了している場合にのみ機能することを忘れないでください。あなたもそれを修正していません。


Joachim Pileborgは、現在は削除された発言で正確なコメントを作成しましたsrand()。通常はプログラムの起動時に一度だけ呼び出すようにする必要があります。genStruct()関数を 1 秒間に 2 回以上呼び出した場合 (さらに 2 回以上呼び出した場合、元の IBM PC で 4 MHz を使用した場合でも) 3 回の呼び出しのうち少なくとも 2 回は、同じ秒) を使用するsrand()と、同じ番号 (時間) で呼び出されるたびに同じデータが生成されます。

于 2012-04-10T05:31:07.697 に答える