2016-03-21 61 views
-1

我試圖輸入一個很長的命令行參數(大概1000-2000個字符),每當我使用cin,getline,scanf或任何類型的流讀者,我的執行停止。我正在使用XCode版本7.2.1(7C1002)。這是我的代碼:當輸入非零大小的字符串時,C++ cin會凍結,零空格

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.

+3

[無法重現](https://ideone.com/X6LcQP) – Xirema

+5

'的命令行參數「不是流I/O的主題。您應該使用main或某些操作系統函數的argc/argv來返回命令行(注意1000個字符的命令行可能太大) –

+0

至少對於15kb ...(OSX)的這種輸入來說,這很有效。還是我錯過了什麼? –

回答

0

無法重現...這是我的版本。

我使用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()大小():26000

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabc

... pqrstu vwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

真實0m0.121s

用戶0m0.004s

SYS 0m0.000s

相關問題