0

此代码生成 26*26*26*26 hasname(使用 az 的组合)或者您可以说出我想分配给结构成员的随机名称。现在,当我通过首先分配该结构成员足够的内存然后使用来分配它时strcpy,只有此代码生成的最后一个哈希名被传递给结构,即 zzzz(它是最后一个哈希名)。我该怎么做才能从一开始就分配哈希名。

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。

4

1 回答 1

0

首先你需要意识到这char vcd_xyz[4]是一个由 4 个字符组成的数组,这意味着你可以放 3 个字符 + 终止字符'\0'。如果将此数组视为以 null 结尾而不是 null 终止,则会导致未定义的行为

您的代码实际上所做的是它遍历所有可能的 4 个字母长字符串组合,从"aaaa"to "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容器中,直到您拥有足够多的字符串,或者您可以生成该字符串的更多独特组合,将所有这些放入 astd::vector中,打乱它并选择 first 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 << ' ';

输出kemy snwv vnmi wfmm wqeg。完整的例子在这里

于 2013-10-01T09:47:19.443 回答