【问题标题】:generateKey cpp functiongenerateKey cpp 函数
【发布时间】:2022-01-10 08:01:04
【问题描述】:

您好,我的一个返回 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

有人可以帮我吗?

【问题讨论】:

  • 您在字符末尾缺少\0 (NUL) 字符。 newKey[31] 必须是 \0。否则,您打印的数量会超出您的预期。

标签: c++ algorithm char


【解决方案1】:

你有两个严重的问题:

  1. 首先,您似乎忘记了 C++ 中的字符串实际上称为 null-terminated 字符串。

    要使字符数组成为“字符串”,它需要以'\0' 字符结尾。这也意味着一个 32 个字符的字符串需要有 33 个元素。

  2. 第二个问题是你返回一个指向本地数据的指针。

    一旦函数generateKey返回,所有局部变量的生命周期结束,指向它们的指针将失效。

您可以非常轻松地解决这两个问题:停止对字符串使用字符数组,并开始对所有字符串使用 C++ 标准 std::string 类。


另外,你应该只在你的程序中调用srand一次。并且 C++ 在生成随机数方面比 C 兼容函数 srand 和 rand 有更好的 functions and classes。

【讨论】:

    【解决方案2】:

    您在字符末尾缺少\0 (NUL) 字符。 newKey[31] 必须是 \0。否则,您打印的数量会超出您的预期。

    在您的示例中,\0 在末尾的 alphanum 内,位置 63。因此程序读取所有内存,直到它“看到”\0。

    您要么切换到使用 std::string 为您处理此问题,要么您需要确保您的所有 char 数组都是以空值结尾的,方法是:

    • 使它们比您的预期输出大一:char newKey[33];

    与

    • 在末尾插入'\0':newKey[32] = '\0';。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      相关资源
      最近更新 更多