随机字符串生成产生奇怪的字符

Random string generation producing weird characters

本文关键字:字符 字符串 随机      更新时间:2023-10-16

我的随机字符串生成从字符 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[sizeof(password) - 1] = ''; //note sizeof works in this case because 
                                       //password is an array and sizeof(char)==1

(您需要将 password 的大小修改为 27,并用随机字符填充前 26 个字符)

由于这是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*