2016-03-21 6 views
-1

Я пытаюсь ввести аргумент командной строки с огромной длиной (примерно 1000-2000 символов) и всякий раз, когда я использую cin, getline, scanf или любой поток читатель, мое исполнение прекращается. Я использую XCode Version 7.2.1 (7C1002). Это мой код:C++ зависает при вводе очень больших строк с нулевым пробелом

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  

EDIT: Я возился вокруг, и я был в состоянии найти, что верхняя предел составляет 1024.

+3

[Невозможно воспроизвести] (https://ideone.com/X6LcQP) – Xirema

+5

'команду line аргумент' не является предметом потокового ввода-вывода. Вы должны использовать argc/argv main или некоторую функцию операционной системы, возвращающую командную строку (обратите внимание, что командная строка из 1000 символов может быть слишком большой) –

+0

Это работает очень хорошо, по крайней мере, для такого ввода 15kb ... (OSX). Или я что-то пропустил? –

ответ

0

Невозможно воспроизвести ... здесь моя версия.

Я использую std :: stringstream, чтобы упростить заполнение файла ram-based с 26K символами. 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; 
    } 

В конце следующего выхода, убунт сообщил длительность как .121 секунд. .


./dumy397

ss.str() размер(): 26000

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabc

... pqrstu vwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

реальные 0m0.121s

пользователь 0m0.004s

SYS 0m0.000s