generateKey cpp 函数
generateKey cpp function
你好,我的一个函数 generateKey() 有问题 returns char*。
它生成密钥正常但是当我打印它时我可以看到一些奇怪的东西。
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
有人可以帮助我吗?
您有两个严重问题:
首先你好像忘记了C++中的字符串真的叫做null-terminated字符串。
要使字符数组成为“字符串”,它需要以 '[=10=]'
字符结尾。这也意味着一个 32 个字符的字符串需要有 33 个元素。
第二个问题是你return一个指向本地数据的指针。
一旦函数generateKey
returns,所有局部变量的生命周期结束,指向它们的指针将失效。
您可以非常轻松地解决这两个问题:停止对字符串使用字符数组,并开始对所有字符串使用 C++ 标准 std::string
class。
另一方面,您应该只在您的程序中调用 srand
一次。与 C 兼容函数 srand
和 rand
.
相比,C++ 在生成随机数方面具有更好的 functions and classes
您的字符末尾缺少 [=10=] (NUL)
字符。在 newKey[31]
需要 [=12=]
。否则你打印的比你想要的多。
在您的示例中,[=12=]
在末尾的 alphanum
内,位置 63。因此程序读取所有内存,直到它“看到”[=12=]
。
要么你切换到使用 std::string
来为你处理这个问题,要么你需要确保你所有的 char
数组都是空终止的,方法是:
- 使它们比您的预期输出大一:
char newKey[33];
AND
- 在末尾插入
'[=19=]'
:newKey[32] = '[=20=]';
.
你好,我的一个函数 generateKey() 有问题 returns char*。 它生成密钥正常但是当我打印它时我可以看到一些奇怪的东西。
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
有人可以帮助我吗?
您有两个严重问题:
首先你好像忘记了C++中的字符串真的叫做null-terminated字符串。
要使字符数组成为“字符串”,它需要以
'[=10=]'
字符结尾。这也意味着一个 32 个字符的字符串需要有 33 个元素。第二个问题是你return一个指向本地数据的指针。
一旦函数
generateKey
returns,所有局部变量的生命周期结束,指向它们的指针将失效。
您可以非常轻松地解决这两个问题:停止对字符串使用字符数组,并开始对所有字符串使用 C++ 标准 std::string
class。
另一方面,您应该只在您的程序中调用 srand
一次。与 C 兼容函数 srand
和 rand
.
您的字符末尾缺少 [=10=] (NUL)
字符。在 newKey[31]
需要 [=12=]
。否则你打印的比你想要的多。
在您的示例中,[=12=]
在末尾的 alphanum
内,位置 63。因此程序读取所有内存,直到它“看到”[=12=]
。
要么你切换到使用 std::string
来为你处理这个问题,要么你需要确保你所有的 char
数组都是空终止的,方法是:
- 使它们比您的预期输出大一:
char newKey[33];
AND
- 在末尾插入
'[=19=]'
:newKey[32] = '[=20=]';
.