此代码生成26 * 26 * 26 * 26 hasname(使用az的组合)或者您可以说我想要分配给结构成员的随机名称。现在我通过首先分配该结构成员足够的内存来分配然后使用strcpy,只有这个代码生成的最后一个hashname被传递给结构,即zzzz(它是最后一个hashname)。我可以这样做,从开始分配hashname。
vcd_xyz[4] = '\0';
int count = 0;
for(int i=0;i<26;i++)
{
vcd_xyz[0] = 'a'+i;
for(int j=0;j<26;j++)
{
vcd_xyz[1] = 'a'+j;
for(int k = 0;k<26;k++)
{
vcd_xyz[2] = 'a' + k;
for(int l=0;l<26;l++)
{
vcd_xyz[3] = 'a' +l;
count ++;
printf("%s\n",vcd_xyz);
}
}
}
}
所以我正在使用
sss->Variables[0].hashname = (char*)calloc(strlen((char*)vcd_xyz)+1,sizeof(char));
strcpy(sss->Variables[0].hashname,(char*)vcd_xyz);
复制生成的hasname,但它正在复制生成的最后一个hashname,所以无论我在哪里使用tr0->Variables[0].hashname = (char*)calloc(strlen((char*)vcd_xyz)+1,sizeof(char));
strcpy(tr0->Variables[0].hashname,(char*)vcd_xyz);
只有zzzz得到打印。我做错了什么或者我应该怎么做才能将hashname分配给顺序的方式。
答案 0 :(得分:0)
首先,你需要意识到char vcd_xyz[4]
是一个包含4个字符的数组,这意味着你可以放置3个字符+终止字符'\0'
。如果您将此数组视为空终止,则会导致 未定义的行为 。
您的代码实际上做的是它迭代4个字母长字符串的所有可能组合,从"aaaa"
到"zzzz"
,使vcd_xyz
数组填充最后一个组合(即"zzzz"
)。
如果你想生成随机4个字母的长字符串,这里是你可能使用的C风格函数:
int irand(int min, int max) {
return ((double)rand() / ((double)RAND_MAX + 1.0)) * (max - min + 1) + min;
}
它从<min;max>
区间生成随机数,可以这样使用:
std::string generateHashTag() {
char str[5];
for (int i = 0; i < 4; ++i)
str[i] = irand('a', 'z');
str[4] = '\0';
return std::string(str);
}
但是如果您想要生成 一组独特的4个字母长哈希标记 ,则需要更复杂的解决方案。在C ++中,您可以轻松地在循环中生成这些字符串,这些字符串会将它们放入std::set
容器中,直到您拥有足够的字符串,或者您可以生成此字符串的更多唯一组合,将所有这些组合成{{1} },将其改组并先选择std::vector
,例如:
N
输出const size_t N = 5;
std::set<std::string> myHashTags;
srand(time(0));
while (myHashTags.size() < N)
myHashTags.insert(generateHashTag());
for (std::set<std::string>::iterator i = myHashTags.begin();
i != myHashTags.end(); ++i)
std::cout << *i << ' ';
。完整示例here。