【发布时间】:2018-05-30 00:44:09
【问题描述】:
我写了一个返回随机字符串的简单函数。
std::string cache::generateCacheName()
{
static const char pool[] = "0123456789abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
std::string r;
std::random_device rd;
std::mt19937 eng(rd());
std::uniform_int_distribution<> distr(0, sizeof(pool) - 1);
for (int i = 0; i < 48; i++)
r += pool[distr(eng)];
return r;
}
但是,有时它会返回一个随机短于 48 个字符的字符串。
我已经在sizeof(pool) 后面添加了- 1,试图避免从pool 添加空终止符,但这并没有改变任何东西。
我哪里做错了?
【问题讨论】:
-
这是一个很好的选择,可以通过调试器单步执行以查看问题所在,并查看您实际添加到该字符串的内容。
-
您是如何确定字符串少于 48 个字符的?
-
@PeteBecker 通过多次调用此方法,其中大约一半最终变得太短,长度变化很大。
-
在对字符串进行索引时应始终考虑空字符串。所以如果
pool是"",那么sizeof(pool)是1. 1-1 == 0,而pool[0]在这种情况下是...... -
“...其中大约一半的结尾太短...”不是您确定字符串结尾太短的方式。