为什么这段代码给出的输出与预期不同?

时间:2019-07-02 13:50:45

标签: c++

尽管我正在使用类似的代码解决一些提高我的技能的问题,但下面的代码却得到了输出“ a @” 我输入了10个'a's

#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;
}

1 个答案:

答案 0 :(得分:8)

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];

并正确地以null终止字符串,如下所示:

a[10] = '\0';