2014-01-09 190 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,並且你的更新也是這樣,我想;) –