2016-03-21 11 views
-1

Ich versuche, ein Befehlszeilenargument mit einer riesigen Länge (ungefähr 1000-2000 Zeichen) einzugeben und wann immer cin, getline, scanf oder irgendeine Art von Stream Leser, meine Ausführung hört auf. Ich verwende XCode Version 7.2.1 (7C1002). Das ist mein Code:C++ cin friert ein, wenn sehr große Strings mit null Whitespace eingegeben werden

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

Dies ist meine Eingabe, die ich getestet habe. Ich kontrolliere nicht die Eingangslänge, die ich verwenden muss, wie es ist. Es ist keine Leerzeichen:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

Hier wird die Code-Ausführung gestoppt wurde:

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  

EDIT: Ich habe das Hantieren und ich habe in der Lage gewesen, dass die oberen zu finden Grenze ist 1024.

+3

[konnte nicht zum Reproduzieren] (https://ideone.com/X6LcQP) – Xirema

+5

'einen Befehl Zeilenargument "ist kein Thema von Stream-I/O. Sie sollten argc/argv von main oder einige Betriebssystem-Funktion die Befehlszeile zurückgeben (beachten Sie eine Befehlszeile von 1000 Zeichen möglicherweise zu groß) –

+0

Das funktioniert ziemlich gut für mindestens so eine Eingabe von 15kb ... (OSX). Oder habe ich etwas verpasst? –

Antwort

0

Kann nicht reproduzieren ... hier ist meine Version.

Ich verwende den std :: stringstream, um das Füllen einer RAM-basierten Datei mit 26K Zeichen zu vereinfachen. std :: stringstream ist sehr nützlich für diese Art von einfachen Tests.

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; 
    } 

Am Ende der folgenden Ausgabe berichtete ubuntu die Dauer als 0,121 Sekunden. .


./dumy397

ss.str() size(): 26000

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabc

... PQRSTU vwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

realen 0m0.121s

Benutzer 0m0.004s

sys 0m0.000s