C/C++ - 生成一个随机字符串覆盖以前的(见下面的代码)

Posted

技术标签:

【中文标题】C/C++ - 生成一个随机字符串覆盖以前的(见下面的代码)【英文标题】:C/C++ - generating a random string overwrites previous (see code below) 【发布时间】:2014-02-01 18:33:02 【问题描述】:

我正在尝试使用找到的代码 here 生成一个随机的字母数字字符串(功能代码在下面重复):

代码:

void gen_random(char *s, const int len) 
    static const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";

    for (int i = 0; i < len; ++i) 
        s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
    

    s[len] = 0;

乍一看,这很好用。但是,当我两次调用该函数时,返回值会被覆盖。让我解释。当我使用代码时:

char image_id[32];
gen_random(image_id, 32); //image_id is correctly populated with a random string at this point.

char feature_id[32];
gen_random(feature_id, 32); //feature_id is correctly populated with a random string at this point. However, image_id is now an empty string?!?!?

image_id 变为空字符串。但是,如果我删除最后一行 gen_random(feature_id, 32);(或它之前的断点),那么 image_id 将被正确存储。

这怎么可能?我在这里错过了什么?

【问题讨论】:

【参考方案1】:

我不确定这是否是导致您的问题的根本原因,但这是一个错误:在函数内部gen_random

s[len] = 0;

当您调用gen_random(image_id, 32); 时,您正在分配image_32[32],这会导致缓冲区溢出,因为数组image_32 只有32 个元素。只有索引 031 才有效。

【讨论】:

我解决了这个问题,但没有任何区别。很好的收获。 +1 是的 - 有一个堆栈,其中 feature_id 在 image_id 的顶部 是的,写char image_id[32]; gen_random(image_id, 31); 成功了。

以上是关于C/C++ - 生成一个随机字符串覆盖以前的(见下面的代码)的主要内容,如果未能解决你的问题,请参考以下文章

C/c++中如何产生指定的随机字符

C语言rand函数生成随机数详解和示例

在 C/C++ 中按照正态分布生成随机数

[NOI2014]随机数生成器

python如何自动生成单个随机字母(a-z)

python生成随机长度字符串并写入文件