为什么我的 C++ 代码会在我的 ASCII 字符串末尾添加无意义的内容?

Why is my C++ code adding nonsense to the end of my ASCII string?

我是 C/C++ 的新手,我正在组装一个糟糕的指关节纹身生成器以习惯使用字符串和种子随机值。 该程序应初始化一个 9 字符的字符串来保存最终的指关节纹身,使用它们的 ASCII 值生成 2 个由 4 个字母组成的随机序列,然后将其输出到控制台。 这并不意味着特别好或性感,我只是用它来习惯使用数组和生成随机值。 这是代码:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void randomKnuckleTatt(char inputString[]);

void main()
{
    char knuckleTatt[9]; //Will hold final tattoo output

    srand((unsigned int)time(nullptr)); //Seeding rand(void)

    randomKnuckleTatt(knuckleTatt); //Generate a random knuckle tattoo and add to knuckleTatt
    cout << "Your bad knuckle tatt is:\n"
      << knuckleTatt << endl;
}

void randomKnuckleTatt(char inputString[])
{
    int i;
    int randomValue;

    for (i = 0; i <= 3; i++)
    {
        randomValue = int(double(rand()) / RAND_MAX * 25 + 65); //Generate random integer and fit to range
        randomValue = char(randomValue); //Cast as char
        inputString[i] = randomValue; //Assign random ASCII letter to array element
    }

    inputString[4] = char(32);

    for (i = 5; i <= 8; i++)
    {
        randomValue = int(double(rand()) / RAND_MAX * 25 + 65);
        randomValue = char(randomValue);
        inputString[i] = randomValue;
    }
}

到目前为止,randomKnuckleTatt 从随机 ASCII 值成功生成了一个有效的指关节纹身(即两个由 space 分隔的四个字母的单词)并修改了 knuckleTatt 数组这些值。 但是,当使用 coutknuckleTatt 打印到控制台时,还会打印大量无意义的 ASCII 字符。它总是打印 knuckleTatt 中包含的字符,以及七个“╠”(十进制的 ASCII 204,如果这对任何人都没有正确显示的话),然后是一些更多的垃圾字符——例如,最近的输出是"UXDP TTKJ╠╠╠╠╠╠╠²┘̶*¸╗".

我在 cout << "Your bad knuckle tatt is:\n" 上的调试中添加了一个断点,并且 knuckleTatt 只包含 randomKnuckleTatt 中生成的 9 个 ASCII 字符。

为什么会发生这种情况,我该如何阻止它?

你忘记了空terminator/character([=10=])的空字符来终止字符串。所以让你的数组更大并将最后一个值设置为 [=10=].

下次使用std::string