c++ - 为什么这段代码给出的输出与预期不同?
问题描述
当我使用类似的代码解决一些提高我的技能的问题时,我得到了以下代码的输出“a@”,我输入了 10 个“a”
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
char a[11];
for(int i = 0; i < 10; i++) cin >> a;
string s(a);
cout << s;
cout << a[3];
return 0;
}
解决方案
for(int i = 0; i < 10; i++) cin >> a;
在这里,您将一个字符串读入a
10 次。前 9 次输入的任何内容都无关紧要,因为它们都是相互覆盖的。如果其中任何一个长度超过 10 个字符,则会出现缓冲区溢出,并且您会得到未定义的行为。
string s(a);
在这里,它正在std::string
使用放入的第十个字符串构造一个a
。
cout << s;
cout << a[3];
现在您正在打印该字符串以及数组中的第四个字符。由于您"a"
根据评论输入了 10 次,因此第四个char
未初始化(前两个分别为'a'
和'\0'
),因此此打印是未定义的行为。
我的猜测是您想阅读 10 个字符,如下所示:
for (int i = 0; i < 10; i++)
cin >> a[i];
并正确地以空值终止字符串,如下所示:
a[10] = '\0';
推荐阅读
- python-3.x - 如何从一个列表创建一个新的元组列表
- scikit-learn - 在分类树中定义数据:有序与名义
- sql - 如何获得一个类别的子集数量?
- asp.net-core - Entity Framework Core 中现有数据库的模型。我需要与上下文类中的表名相同
- javascript - 碰撞后如何在 Matter.js 中保持速度?
- python - 如何在kivy中按按钮删除?
- java - log4j:ERROR 没有为名为 [file] 的附加程序设置输出流或文件
- r - 如果使用相同的种子,为什么引导方法的结果会有所不同?
- rust - `impl ... for` 是什么意思?
- apache-spark - 我如何制作一个关于组的列对?