【问题标题】:why this code giving different output than expected? [closed]为什么这段代码给出的输出与预期不同? [关闭]
【发布时间】:2019-07-02 13:50:45
【问题描述】:

当我使用类似的代码解决一些提高我的技能的问题时,我得到以下代码的输出“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 &lt; 10; i++) cin &gt;&gt; a; 不会像您认为的那样做。此外,如果您抱怨预期行为与实际行为之间的差异,您的问题必须包含输入、预期输出、实际输出以及您预期预期输出的原因。
  • std::string 将期望 a 以空值结尾,但事实并非如此。确保a[10] 等于'\0'
  • @ChakerTriangle,如果你想为数组的每个元素分配一个"a",你需要像这样写:cin &gt;&gt; a[i]; 并为最后一个元素设置'\0'。
  • 如果要输入10个字符串,应该使用string a[10]; for (i = 0; i &lt; 10; ++i) cin &gt;&gt; a[i];

标签: c++ output


【解决方案1】:
for(int i = 0; i < 10; i++) cin >> a;

在这里,您将一个字符串读入a 10 次。前 9 次输入的内容无关紧要,因为它们都是相互覆盖的。如果其中任何一个长度超过 10 个字符,则会出现缓冲区溢出,并且您会得到未定义的行为。

string s(a);

这里它使用放入a的第十个字符串构造一个std::string

cout << s;
cout << a[3];

现在您正在打印该字符串以及数组中的第四个字符。由于您根据评论输入了 10 次 "a",因此第四个 char 未初始化(前两个分别为 'a''\0'),因此此打印是未定义的行为。

我的猜测是你想阅读 10 个字符,像这样:

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

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

a[10] = '\0';

【讨论】:

  • Nitpick: a[3] 实际上是第四个字符。
  • @ThomasMatthews 谢谢你,我不敢相信我犯了这个错误。 :)
猜你喜欢
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
相关资源
最近更新 更多