c++ - 为什么我的 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
.
为什么会发生这种情况,我该如何阻止它?
解决方案
您忘记了空终止符/字符 ( \0
) 的空间来终止字符串。因此,使您的数组更大并将最后一个值设置为\0
.
std::string
下次使用。
推荐阅读
- angular - 选择选项后如何禁用 mat-radio-buttons
- gradle - 如何将 jar 发布到 NEXUS 存储库
- javascript - 我得到 throw new ERR_SERVER_ALREADY_LISTEN(); 当我尝试使用 node.js 运行我的程序时。我关错了吗?
- javascript - Strapi:创建导入工作的最佳方式是什么?
- python - 如何从python导出多个文件
- fortran - 主成分分析 -> 逆/反转模式
- reactjs - 如何处理 axios 错误并显示带有错误消息的模态
- c# - C# 应用程序仅在工作区文件夹中工作
- javascript - 以 navigator.userAgent 为例的 JavaScript 箭头函数
- java - 在子类中获取私有访问错误