【问题标题】:Unable to read two strings with cin.get()无法使用 cin.get() 读取两个字符串
【发布时间】:2015-05-08 08:55:44
【问题描述】:

为什么尝试使用 cin.get() 输入两个字符串会失败?我可以成功读取第一个字符串,但第二个字符串和后续操作的输入失败..见代码:

#include <iostream>
#include <stdlib.h>

int main(){
long int n,k;
char a[11],b[11];
cin.get(a,11);

n = atoi(a);

cin.get(b,11);
cout<<b;   
k = atoi(b);


cout      << "\ncin.rdstate(): " << cin.rdstate()
      << "\n    cin.eof(): " << cin.eof()
      << "\n   cin.fail(): " << cin.fail()
      << "\n    cin.bad(): " << cin.bad()
      << "\n   cin.good(): " << cin.good() << endl << endl;
}

我正在尝试输入两个字符串并将它们存储到 long int 变量中,如程序所示,但 cin.get(b,11) 失败并且发生堆栈溢出 k= atoi(b) 。此外,您可能会观察到 cout&lt;&lt;b 没有输出任何内容。最后 cin.fail() 设置为 1 ,这意味着我正在做某种逻辑错误。请帮助我纠正这个问题! 请建议一些快速且仅适用于 c++ 的方法.. (如果您觉得这个问题太糟糕,请在投反对票之前在 cmets 中提及,我已经在 21 名代表中挣扎!)

【问题讨论】:

  • 您是否在代码中声明了“a”和“b”?
  • 您能告诉我们您的意见吗?
  • 当您使用 C++ 进行编码时,我建议您使用 std::string 而不是 C 的 char[]
  • 我建议改用std::stringstd::getline。如果你有 C++11,那么 std::stoi 转换为整数。
  • std::string 够快吗??我必须在 3 秒内执行 2.5 Mbs 的输入和输出 .. 我这样做是为了比赛..

标签: c++ iostream


【解决方案1】:

\n 将在第一个 cin 之后保留在缓冲区中。你可以通过添加一个空的cin.get()来解决这个问题

cin.get(a,11);
n = atoi(a);
cin.get();
cin.get(b,11);
cout<<b;   
k = atoi(b);

【讨论】:

    【解决方案2】:

    cin.get() 不从输入中提取分隔符 (documentation)。

    如果您是使用流的 C++,则使用内置功能是有意义的。特别是,C++ 提供了格式化的 I/O。要读取两个数字,您应该使用:

    long int a, b;
    cin >> a;
    cin >> b;
    

    这将从标准输入中读取两个数字。


    如果担心速度,请尝试关闭 C I/O 同步:std::ios::sync_with_stdio(false); 有一个有趣的基准 here 表明,如果您关闭与 C I/O 的同步,流实际上非常快。

    【讨论】:

    • 因为被格式化,cin 对于大容量操作来说非常慢。我显然知道 cin .. 我只用它开始了 c++!
    • 太棒了!我只是想要 c++ 中的 c 速度并得到它!
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2019-11-06
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多