首页 > 解决方案 > 为什么我的 C++ 代码在我的 ASCII 字符串末尾添加废话?

问题描述

我对 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 值生成了一个有效的指关节纹身(即两个由空格分隔的四个字母的单词),并knuckleTatt用这些值修改了数组。但是,当使用knuckleTatt打印到控制台时cout,还会打印大量无意义的 ASCII 字符。它总是打印包含在 中的字符knuckleTatt,以及七个“╠”(十进制的 ASCII 204,如果任何人都不能正确显示的话),然后是更多的垃圾字符 - 例如,最近的输出是“UXDP TTKJ╠ ╠╠╠╠╠╠²┘▬*¸╗”。

我在 debug on 中添加了一个断点cout << "Your bad knuckle tatt is:\n",并且knuckleTatt只包含在randomKnuckleTatt.

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

标签: c++ascii

解决方案


您忘记了空终止符/字符 ( \0) 的空间来终止字符串。因此,使您的数组更大并将最后一个值设置为\0.

std::string下次使用。


推荐阅读