2012-04-10 93 views
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); 
} 
} 

任何幫助將sooooo讚賞。 謝謝

+1

你忘了問一個問題.... – 2012-04-10 05:17:04

+0

我無法創建隨機的名稱,我不知道問題是什麼或真的如何問它 – 2012-04-10 05:23:36

回答

0

一個主要問題是您沒有爲字符串分配空間。你在結構中有一個未初始化的char *Name

坦率地說,對於6(甚至8個)字符,您應該簡單地將數組分配爲結構的一部分。在64位機器上,指針會比數組大;在一臺32位的機器上,你仍然會使用指針加數據的空間而不僅僅是數據。

你的角色生成循環也是不可靠的。 rand()表達式或多或少是合理的(它不會生成'Z',並且會偏向字母表的開頭),但是您應該使用'A'而不是65,並且您應該簡單地將字符分配給相關位置名字。使用snprintf()這樣會得到你每個字母的代碼的10位數字,這不是你想要的。

不要忘記null結束字符串。並且不要忘記strcat()只有在字符串已經是空終止時纔有效;你還沒有解決這個問題。


Joachim Pileborg在現在刪除的言論作出了準確的評論,你應該確保你只叫srand()一次,通常在程序啓動。如果您在一秒鐘內多次撥打genStruct()函數(如果您撥打電話的次數超過兩次,那麼即使在原始IBM PC上,4 MHz的電話號碼—也幾乎可以保證你的電話號碼至少有兩個在同一秒鐘),那麼你將得到相同的數據生成每次srand()被調用相同的數字(時間)。