【问题标题】:C++ cin freezes when entering very large strings with zero whitespace输入具有零空格的非常大的字符串时,C++ cin 冻结
【发布时间】:2016-03-21 19:14:48
【问题描述】:

我正在尝试输入一个长度很大(大约 1000-2000 个字符)的命令行参数,每当我使用 cin、getline、scanf 或任何类型的流阅读器时,我的执行都会停止。我正在使用 XCode 版本 7.2.1 (7C1002)。这是我的代码:

int main() {
   string S = "";
   cin >> S;
   cout << S;
   return 0; 
}

这是我一直在测试的输入。我不控制输入长度,我必须按原样使用。空白字符为零:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

这是代码执行停止的地方:

libsystem_kernel.dylib`__read_nocancel:
0x7fff8ff6407c <+0>:  movl   $0x200018c, %eax
0x7fff8ff64081 <+5>:  movq   %rcx, %r10
0x7fff8ff64084 <+8>:  syscall 
->  0x7fff8ff64086 <+10>: jae    0x7fff8ff64090            ; <+20>
0x7fff8ff64088 <+12>: movq   %rax, %rdi
0x7fff8ff6408b <+15>: jmp    0x7fff8ff5ebdd            ; cerror_nocancel
0x7fff8ff64090 <+20>: retq   
0x7fff8ff64091 <+21>: nop    
0x7fff8ff64092 <+22>: nop    
0x7fff8ff64093 <+23>: nop    

编辑: 折腾了一下,发现上限是1024。

【问题讨论】:

  • a command line argument 不是流 I/O 的主题。您应该使用 main 的 argc/argv 或一些返回命令行的操作系统函数(注意 1000 个字符的命令行可能太大)
  • 至少对于这样的 15kb 输入来说效果很好......(OSX)。还是我错过了什么?
  • @DieterLücking 在 Ubuntu 15.10 上,命令行的长度有一个上限,但似乎相当大“getconf ARG_MAX”报告 2097152。“xargs --show-limits”报告131072 个字符。
  • @Xirema 所以我想这是编译器的问题。很高兴知道。我想知道我的怎么了?我换了别的东西,然后回复大家。

标签: c++ input iostream cin large-data


【解决方案1】:

无法重现...这是我的版本。

我正在使用 std::stringstream 来简化使用 26K 字符填充基于 ram 的文件。 std::stringstream 对于这类简单的测试非常有用。

  void t397input(std::stringstream& ss)
  {
     for (int i = 0; i<1000; ++i)
        ss << "abcdefghijklmnopqrstuvwxyz"; // 26000 chars

     std::cout << "ss.str().size(): " << ss.str().size() << std::endl;
  }

  int t397(void)
  {
     std::stringstream ss;
     t397input(ss);

     std::string S;
     ss >> S;
     std::cout << S.size() << "\n"
               << S << std::endl;
     return 0;
  }

在以下输出的末尾, ubuntu 报告持续时间为 0.121 秒。


./dumy397

ss.str().size(): 26000

26000

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabc

... pqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

真正的 0m0.121s

用户 0m0.004s

系统 0m0.000s

【讨论】:

    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2022-08-06
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多