我的随机字符串生成从字符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
。有人能指出我正确的方向吗?
答案 0 :(得分:2)
您需要在字符串的末尾附加一个空终结符。
password[sizeof(password) - 1] = '\0'; //note sizeof works in this case because
//password is an array and sizeof(char)==1
(您需要将password
的大小修改为27,并使用随机的字符填写前26个字符)
答案 1 :(得分:1)
由于这是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*
。如果需要char*
,您可以访问OnGenerate.c_str()
。