我的程序需要从 stdin 读取最多 50k 个字符长的字符串。代码如下:
#include <iostream>
#include <string>
std::string A;
int main(){
std::cin >> A;
std::cout << "String max: " << A.max_size() << std::endl;
std::cout << "Size: " << A.size();
当我尝试输入 10k 字符长的字符串时,我得到以下输出:
String max: 4611686018427387903
Size: 4095
据谷歌称std::cin
and std::string
处理 10k 个字符应该没有问题,但由于某种原因A
在 4095 个字符后被截断。我通过将字符串粘贴到默认的 Ubuntu 终端来输入该字符串。将它粘贴到同一终端中的 Python3 中效果很好,这让我相信不是终端截断了它,而是 C++。我编译了g++ program.cxx
我有 16 GB 内存。
如何从标准输入输入大字符串?任何帮助表示赞赏。
P.S.:如果你需要一个大字符串,只需将其粘贴到 Python 中:print("123"*5000)
在规范模式下,您可能会遇到 Linux 终端的 4096 行限制输入。如果您尝试在 Linux 终端中输入很长的行(>4095 个字符),则多余的行将被丢弃,直到您输入换行符或 eof 字符来刷新终端缓冲区。
有几种方法可以解决这个问题:
- 在输入中每隔一段时间插入一个 eof/flush 字符(通常是 ctrl-D)——每个这样的字符都会刷新终端缓冲区,重置 4K 限制,并允许输入更长的行。注意不要在换行符或另一个 eof 之后立即插入一个,因为这会导致输入出现 EOF
- 将终端置于非规范模式。这将导致缓冲区在进程读取时被刷新;大多数进程的读取速度通常比在终端中键入或粘贴字符的速度快得多,因此您永远不会接近 4K 限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)