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

时间:2014-01-09 23:25:29

标签: c++ string random

我的随机字符串生成从字符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。有人能指出我正确的方向吗?

2 个答案:

答案 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块末尾的范围,如果OnGeneratechar*,那么您最终会得到悬空指针 。直接使用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()