Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的随机字符串生成器生成的字符串太短?_C++_String_Random - Fatal编程技术网

C++ 为什么我的随机字符串生成器生成的字符串太短?

C++ 为什么我的随机字符串生成器生成的字符串太短?,c++,string,random,C++,String,Random,我编写了一个简单的函数,返回一个随机字符串 std::string cache::generateCacheName() { static const char pool[] = "0123456789abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; std::string r; std::random_device rd; std::mt19937 eng(rd()); std::uniform_

我编写了一个简单的函数,返回一个随机字符串

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;
}
std::字符串缓存::generateCacheName()
{
静态常量字符池[]=“0123456789abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz”;
std::字符串r;
std::随机_装置rd;
标准:mt19937英语(rd());
标准:统一内部分布(0,大小为(池)-1);
对于(int i=0;i<48;i++)
r+=池[Disr(eng)];
返回r;
}
但是,有时它会随机返回一个短于48个字符的字符串

我已经在
sizeof(pool)
后面添加了
-1
,试图避免从
pool
添加空终止符,但这没有改变任何事情

哪里出错了?

a)给定一个字符串文字“123”,大小是4,因为它是一个包含4个常量字符的数组,计算空值

b) 当你从这个尺寸中减去1,你得到3

c) 如果有一个包含3个元素的数组,则第3个元素位于偏移量2处

d) std::在闭合区间[a,b]上定义了均匀分布。也就是说,从a到b的两个端点都包括在内

e) 当您选择一个随机数,并且它恰好是该间隔中的最大值(在本例中为3)时,您从池中获取尾随的空字节,并将其插入字符串中。您可能希望最大值为2,而不是3


因此,如果碰巧选择了发行版中的最大数字,则字符串很短。如果strlen(pool)-1不是空的,那么您的代码可能会更清晰。

这是一个很好的选择,可以使用调试器查看出错的地方,另外,看看你实际上是如何添加到字符串中的。你是如何确定字符串比48个字符短的?@ PeeBeKek通过多次调用这个方法,其中大约有一半结束得太短,长度变化很大。在索引到字符串时,应该始终考虑一个空字符串。因此,如果
pool
为“”,则
sizeof(pool)
为1。1-1==0,在这种情况下,
pool[0]
是……“…大约一半的字符串结束得太短…”不是您确定字符串结束得太短的方式。0是类型为
std::string
的对象中的有效字符值。循环看起来很好,并创建了一个包含48个字符的字符串对象。您可能是对的,调用此函数的代码不喜欢嵌入nul字符,但问题中没有足够的信息可以确定。@PeteBecker确实如此
sizeof(astringdinginaullterminator)-1始终是空终止符。Pete的观点是,STD::String比通常打算的“容器类”更为有效,在字符串的中间存储嵌入的空值是完全有效的。这只是一个问题,如果你解释这些空值比它们实际的意义更大(这很常见),这就是我猜OP遇到的问题。啊,是的!考虑到我与C代码的频繁交互,这一点对我来说一直是学术性的,但也足够公平。抱歉。这是一个很好的例子,说明a比
const char[]