2014-01-09 192 views
1

我的随机字符串生成从字符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

您没有向我们展示输出任何内容的代码。有点重要......几乎可以肯定的是,这是由于不是零终止你的C字符串。你为什么不使用'std :: string'? –

回答

2

您需要在字符串末尾附加一个空终止符。

​​

(你将需要修改的password大小27,并填写前26个字符随机的)

+0

@BenjaminLindley打算写sizeof。 –

+0

谢谢你,我从来没有想过null结束字符串。 – user3179762

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); 
} 

你应该申报OnGeneratestd::string型,而不是char*的。如果需要OnGenerate.c_str(),则可以访问char*

+1

大家都赞成使用C++概念,但当'password'超出范围时'OnGenerate'会发生什么? –

+0

谢谢你的回答,这也帮助我。 – user3179762

+0

@LuchianGrigore同样会发生在OP的代码中'OnGenerate' var,并且你的更新也是这样,我想;) –