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);
}
}
任何帮助都会受到赞赏。 感谢
答案 0 :(得分:0)
一个主要问题是您没有为字符串分配空间。您在结构中有未初始化的char *Name
。
坦率地说,对于6个(甚至8个)字符,您应该简单地将数组分配为结构的一部分。在64位机器上,指针将大于数组;在32位机器上,你仍然会使用带指针加数据的空间而不仅仅是数据。
你的角色生成循环也很不稳定。 rand()
表达式或多或少是合理的(它不会生成'Z'并且会偏向字母表的开头),但是您应该使用'A'
而不是65,而您应该只是将字符分配给名称中的相关位置。像这样使用snprintf()
会得到每个字母代码的10位数,这根本不是你想要的。
不要忘记null终止字符串。并且不要忘记strcat()
仅在字符串已经空终止时才有效;你还没有解决这个问题。
Joachim Pileborg在现已删除的评论中做了准确的评论,您应该确保只拨打srand()
一次,通常是在程序启动时。如果你在一秒钟内多次调用genStruct()
函数(并且如果你调用它超过两次,你几乎可以保证 - 即使在4 MHz的原始IBM PC上 - 你将至少有两个然后,每次使用相同的数字(时间)调用srand()
时,您将获得相同的数据。