首页 > 解决方案 > 为什么这段代码给出的输出与预期不同?

问题描述

当我使用类似的代码解决一些提高我的技能的问题时,我得到了以下代码的输出“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;
}

标签: c++output

解决方案


for(int i = 0; i < 10; i++) cin >> a;

在这里,您将一个字符串读入a10 次。前 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';

推荐阅读