无法将长 cin 输入读入字符串

Posted

技术标签:

【中文标题】无法将长 cin 输入读入字符串【英文标题】:Can't read in a long cin input to a string 【发布时间】:2017-02-24 16:54:29 【问题描述】:

我的代码看起来像这样

string inputString;
std::getline (std::cin, inputString)
cout << inputString;

当我输入一个长字符串 ~30k 个字符时,inputString 只有该字符串的一部分。任何想法如何解决这个问题?

【问题讨论】:

您确定它不包含完整的输入吗?如果你输出inputString.size(),你会得到什么? 大小是否会受到终端最大允许行长的限制? 您能否添加导致此问题的示例输入及其生成的输出?它可能有助于确定问题。 一定要再次尝试 std::getline() ......看看文本的其余部分是否被第二次读取...... inputString.size() = 4905,远低于全文。我又做了一个getline,它没有自动获取新文本。我尝试了不同的文本,但由于某种原因仍然上限为 4905。 【参考方案1】:

来自std::getline()cppreference.com 上的文档:

getline 从输入流中读取字符并将它们放入字符串中:

1。表现为UnformattedInputFunction,但input.gcount() 不受影响。构建并检查哨兵对象后,执行以下操作:

    致电str.erase()

    input 中提取字符并将它们附加到str,直到出现以下情况之一(按列出的顺序检查)

    一个。 input 上的文件结束条件,在这种情况下,getline 设置 eofbit

    b.下一个可用的输入字符是delim,由Traits::eq(c, delim) 测试,在这种情况下,分隔符是从input 中提取的,但不会附加到str

    c。 str.max_size() 字符已存储,在这种情况下,getline 设置failbit 并返回

    如果由于某种原因没有提取字符(甚至没有被丢弃的分隔符),getline 设置 failbit 并返回。

2。与getline(input, str, input.widen('\n')) 相同,即默认分隔符为结束符​​。

因此请检查您的输入是否受到inputString.max_size() 值的限制。您的系统上可能接近 32k。

【讨论】:

如果 Turbo C++ 可能是 16k :D 嗯,不,max_size() 是 4294967295 的巨大尺寸【参考方案2】:

默认情况下,终端工作在规范模式,它有一个长度为 4096 字节的缓冲区。所以这就是字符串可以接受的最大输入是 4095 的原因。现在解决方案是在 Linux 中更改为非规范模式。你可以这样做

$ stty -icanon # for switching to the noncanonical mode.
$ stty icanon  # reverting back to the canonical mode when you are done.

【讨论】:

以上是关于无法将长 cin 输入读入字符串的主要内容,如果未能解决你的问题,请参考以下文章

cin读入string对象

C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符

c++第二遍scanf读入问题

为啥不能用scanf读入一个含有空格的字符串

关于c++文件流读入和写入的问题

将输入读入 C 风格的字符串