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 个元素。只有索引 0
到 31
才有效。
【讨论】:
我解决了这个问题,但没有任何区别。很好的收获。 +1 是的 - 有一个堆栈,其中 feature_id 在 image_id 的顶部 是的,写char image_id[32]; gen_random(image_id, 31);
成功了。以上是关于C/C++ - 生成一个随机字符串覆盖以前的(见下面的代码)的主要内容,如果未能解决你的问题,请参考以下文章