生成奇怪字符的随机字符串生成
我的随机字符串生成从字符a-z生成一个随机字符串就好了,但在它的结尾处,有一些奇怪的字符:ÌÌÌÌÌÌÌÌÌ
。此外,在奇怪的字符后,它再次打印a-z
。生成奇怪字符的随机字符串生成
if(m_lower.GetCheck() == 1)
{
char pwd[] = "abcdefghijklmnopqrstuvwxyz";
char password[26];
for(int i=0; i<26; i++) {
password[i] = pwd[rand()%26];
}
OnGenerate = password;
UpdateData(FALSE);
}
上述代码检查复选框是否被选中,然后将随机文本发送到编辑控件。这几乎可以正常工作,它只是奇怪的字符,并在最后加上a-z
。任何人都可以将我指向正确的方向吗?
您需要在字符串末尾附加一个空终止符。
(你将需要修改的password
大小27,并填写前26个字符随机的)
@BenjaminLindley打算写sizeof。 –
谢谢你,我从来没有想过null结束字符串。 – user3179762
由于这是C++而不是C,你应该采取的std::string
优势:
if(m_lower.GetCheck() == 1)
{
char pwd[] = "abcdefghijklmnopqrstuvwxyz";
std::string password;
for(int i=0; i<26; i++) {
password.append(1, pwd[rand() % 26]);
}
OnGenerate = password.c_str();
UpdateData(FALSE);
}
因此消除了任何需要明确跟踪字符串终止符。由于密码变量将在if
块的末尾超出范围,因此如果OnGenerate
是char*
,那么您将最终得到一个悬挂指针。直接使用string
,确保了内容保持活动状态:
if(m_lower.GetCheck() == 1)
{
char pwd[] = "abcdefghijklmnopqrstuvwxyz";
OnGenerate.clear();
for(int i=0; i<26; i++) {
OnGenerate.append(1, pwd[rand() % 26]);
}
UpdateData(FALSE);
}
你应该申报OnGenerate
是std::string
型,而不是char*
的。如果需要OnGenerate.c_str()
,则可以访问char*
。
大家都赞成使用C++概念,但当'password'超出范围时'OnGenerate'会发生什么? –
谢谢你的回答,这也帮助我。 – user3179762
@LuchianGrigore同样会发生在OP的代码中'OnGenerate' var,并且你的更新也是这样,我想;) –
您没有向我们展示输出任何内容的代码。有点重要......几乎可以肯定的是,这是由于不是零终止你的C字符串。你为什么不使用'std :: string'? –