2012-04-10 110 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()被调用相同的数字(时间)。