2016-02-06 6 views
0

Мне интересно, что является принятым способом ввода ввода из командной строки, который также фиксирует пробел. Я думал, что это сделаю это ...Чтение стандартного ввода в массив символов - C++

char text[500]; 
int textSize = 0; 

int main() { 

    while (!cin.eof()) { 
     cin >> text[textSize]; 
     textSize++; 
    } 

    for(int i = 0; i < textSize; i++) { 
     cout << text[i]; 
    } 

return 0; 
} 

Но похоже, что он пропускает пробел. Я переключился на это ...

char c; 

while ((c = getchar()) != EOF) { 
    text[textSize] = c; 
    textSize++; 
} 

, который отлично работает, но я знаю это из книги программирования C. Интересно, как бы я справился с этим в C++

+0

Вы можете использовать 'istream :: get' – user3813674

+0

_'char text [500];' _ Скорее используйте 'std :: string'. –

+0

['while (! Cin.eof())'] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) является ошибкой –

ответ

3

По умолчанию оператор извлечения потока в C++ пропускает пробелы. Вы можете управлять этим с noskipws потока манипулятором:

while (!cin.eof()) { 
    cin >> noskipws >> text[textSize]; 
    textSize++; 
} 

Тем не менее, программа, которую вы написали имеет довольно четкую проблему переполнения буфера, если вы читаете слишком много текста. Если вы планируете читать фиксированное количество байтов, используйте istream::read. Если вы хотите, чтобы прочитать переменное количество байтов, рассмотреть возможность использования std::string в сочетании с istream::get, как это:

std::string input; 
char ch; 

while (cin.get(ch)) { 
    input += ch; 
} 

Это не риск переполнения буфера и должен обрабатывать столько текст как возможно (с ограничениями на доступную память, конечно.)

+0

Спасибо! Когда вы говорите о риске переполнения буфера, вы имеете в виду, потому что, если вход больше, чем массив, массив не будет иметь правильное завершение. Я также вижу, что на самом деле вам не нужно было указывать индекс для итерации при вставке на вход «input + = ch». Когда я попробовал распечатать, я думал, что могу прокручивать его, выполняя ввод ++, но это не сработало – cpd1

+0

@ cpd1 Да, более или менее это то, что он имеет в виду. Точный ответ на этот вопрос заключается в том, что при попытке сделать это вы получите неопределенное поведение. См. Подробное объяснение: https://stackoverflow.com/questions/1239938/accessing-an-array-out-of-bounds-gives-no-error-why Вы не можете использовать input ++, потому что ввод - это строка type, а оператор ++ не определен в строках. То, что определено в строках, является оператором +, который просто добавляет две строки, или в этом случае строку и символ. –