您好,我的一個回傳 char* 的函式 generateKey() 有問題。它生成正常的密鑰,但是當我列印它時,我會看到一些奇怪的東西。
char* aesStartup::generateKey()
{
const char alphanum[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char newKey[32];
srand(time(0));
for (int i = 0; i < 32; i )
newKey[i] = alphanum[rand() % 62];
cout << newKey;
return newKey;
}
輸出:u6gWj8dBHxJhEztsHXfE5V3HSvZ2zVNb╠╠╠╠╠╠╠╠0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
有人能幫我嗎?
uj5u.com熱心網友回復:
你有兩個嚴重的問題:
首先,您似乎忘記了 C 中的字串實際上稱為空終止字串。
對于要成為“字串”的字符陣列,它需要以
'\0'字符結尾。這也意味著 32 個字符的字串需要有 33 個元素。第二個問題是您回傳一個指向本地資料的指標。
一旦函式
generateKey回傳,所有區域變數的生命周期結束,指向它們的指標將失效。
您可以很容易地解決這兩個問題:停止對字串使用字符陣列,并開始std::string對所有字串使用 C 標準類。
另一方面,您應該只在程式中呼叫srand 一次。和C 有更好的函式和類的比C兼容性函式產生亂數srand和rand。
uj5u.com熱心網友回復:
您缺少\0 (NUL)字符末尾的字符。在newKey[31]需要\0。否則你列印的比你希望的多。
在您的示例\0中alphanum,位于末尾,位置 63。因此程式會讀取所有記憶體,直到它“看到” \0.
您可以切換到使用std::stringwhich 為您處理此問題,或者您需要確保所有char陣列都以空值結尾,方法是:
- 使它們比您的預期輸出大一:
char newKey[33];
和
'\0'在末尾插入:newKey[32] = '\0';.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409384.html
標籤:
上一篇:Python中的多重集
下一篇:找到一組三元組的最大GCD
