2012-04-10 9 views
0

Hey so bin ich hart kämpfen. Ich muss eine zufällige Zeichenfolge (der Länge 2 bis 6) erstellen und ein zufälliges Zeichen für jedes "A" bis "Z" generieren. Das Problem ist, dass ich versuche, eine Struktur mit einem char * darin zu verwenden. Ordnen Sie dann jede Struktur dynamisch zu, wenn ich versuche, die Zufallsdaten zu generieren.Zufallslänge Zeichenkette mit zufälligen Zeichen

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); 
} 
} 

Jede Hilfe wäre soooo geschätzt. danke

+1

Sie haben vergessen, eine Frage zu stellen .... –

+0

Ich bin nicht in der Lage, den Zufall der Name zu erstellen, ich weiß nicht, was das Problem ist oder wirklich, wie man es fragt –

Antwort

0

Ein primäres Problem ist, dass Sie keinen Platz für die Zeichenfolge reservieren. Sie haben eine nicht initialisierte char *Name in der Struktur.

Ehrlich gesagt, für 6 (sogar 8) Zeichen, sollten Sie einfach das Array als Teil der Struktur zuweisen. Auf einer 64-Bit-Maschine wäre der Zeiger größer als das Array. Auf einem 32-Bit-Computer würden Sie immer noch mehr Platz mit einem Zeiger plus Daten als mit nur den Daten verwenden.

Ihre Zeichengenerierungsschleife ist auch wonky. Der Ausdruck rand() ist mehr oder weniger vernünftig (er erzeugt kein 'Z' und wird auf den Anfang des Alphabets ausgerichtet), aber Sie sollten 'A' anstelle von 65 verwenden, und Sie sollten das Zeichen einfach der entsprechenden Position in zuweisen der Name. Mit snprintf() erhalten Sie die 10-stellige Stelle des Codes für jeden Buchstaben, die nicht das ist, was Sie überhaupt wollen.

Vergessen Sie nicht, die Zeichenfolge null zu beenden. Und vergessen Sie nicht, dass strcat() nur funktioniert, wenn die Zeichenfolge bereits null terminiert ist; Das hast du auch nicht behoben.


Joachim Pileborg machte einen genauen Kommentar in einer nun gelöscht Bemerkung, dass Sie rufen Sie nur srand() einmal sicherstellen sollen, in der Regel beim Programmstart. Wenn Sie die genStruct() Funktion mehr als einmal in einer Sekunde aufrufen (und wenn Sie es mehr als zweimal aufrufen, können Sie so gut wie sicher sein, dass Sie auf einem Original IBM PC mit 4 MHz — mindestens zwei der drei Anrufe haben die gleiche Sekunde) dann erhalten Sie die gleichen Daten jedes Mal generiert srand() mit der gleichen Nummer (Zeit) aufgerufen wird.

Verwandte Themen