2015-09-07 6 views
1

достижения Цели

станд :: GetLine(), в то время как содержание цикл не работает


Новые на C++ и не нашли окончательного ответа на этот вопрос в другом месте. Я работаю над простой программой, которая читает в сообщении, введенном пользователем из консоли. Это упражнение для использования строковых переменных/конкатенации.

Мне нужно создать цикл, который читается в пользовательском вводе, который может содержать несколько строк ввода из командной оболочки.

Таким образом, моя функция должна читать этот вход, игнорируя новые строки, и заканчивать, если пользователь вводит два « &» на новой строке.

Покушение


Так вот моя функция:

string get_message() { 
    string message, line; 
    cout << "Enter the message > "; 
    cin.ignore(256, '\n'); 
    while (getline(cin, line) && line != "&&") { 
     message = message + " " + line; 
     cout << message; 
     cin.clear(); 
    } 
    return message; 
} 

Проблема Я бегу в том, что в то время цикла, пока && не найдено, содержание цикла не представляется запустить. Значение, когда я cout << message Я получаю только одну предыдущую строку ввода.

Sample Run


Enter the Message > Messages.. this is a new message. 
I'm a message on a new line, look at me. 
New line. 
&& 
"New line." <--- from console cout 

Result: New line. 

Вопросы:


  • Когда содержание цикла дозвонились?
  • Почему я получаю только предыдущую строку, а не ВСЕ ранее (предположительно) конкатенированные строки?
  • Есть ли лучший способ кодировать это?
+0

«содержание цикла не отображается для запуска» - это, конечно же. где вы печатаете 'сообщение'? –

+0

Внутри цикла (отредактировано) – acupajoe

+0

Вы понимаете, что 'cin.ignore (256, '\ n');' ест вашу первую строку ввода, правильно? – WhozCraig

ответ

2

Нарушение этого вниз:

string get_message() { 
    string message, line; 
    cout << "Enter the message > "; 

стандартный материал. Здесь нечего смотреть. Двигайтесь вперед.

cin.ignore(256, '\n'); 

Откажитесь от первой линии или 256 символов, в зависимости от того, что наступит раньше. Наверное, не то, что вы хотите сделать. Идеологически, если вы думаете, что в потоке может быть дерьмо, очистите поток до вызова функции. Во всяком случае, определенно часть проблемы OP.

while (getline(cin, line) && line != "&&") { 

Успешно получил линию и линию не "& &". Выглядит неплохо. NOte: новые строки лишаются функцией getline, потому что они являются разделителями токенов и оставляют их в возвращаемом токене или оставляют их в потоке, что может вызвать проблемы.

 message = message + " " + line; 

Append линия сообщение

 cout << message; 

Написать сообщение для вывода. Не происходит промывки, поэтому, когда сообщение делает его на экране, оно непредсказуемо.Это может быть причиной части проблемы OP.

 cin.clear(); 

Очистить состояние ошибки на cin. Не нужно. Если cin был в состоянии ошибки, цикл while не был бы введен.

} 
    return message; 
} 

Нормальный материал. Здесь ничего не видно, но если программа заканчивается вскоре после этой точки, вызывается cout.flush(), std::flush отправляется в cout, или есть cout << endl;, cout будет краснеть и сообщения будут внезапно появляться.

Таким образом, используя вход OP в:

Messages.. this is a new message. 

Это стерт cin.ignore

I'm a message on a new line, look at me. 

должны появиться в конце концов. Не знаю, почему OP не видит этого. Я не могу воспроизвести.

New line. 

Должно появиться в конце концов.

&& 

Конец ввода.

Вывод должен быть:

I'm a message on a new line, look at me. I'm a message on a new line, look at me. New line. 

И я озадачен, почему OP не получает это в первый раз соиЬ получает покраснел. Как я уже сказал, невозможно воспроизвести.

Возвращение должно быть:

I'm a message on a new line, look at me. New line. 
+0

Я очень ценю ответ! Определенно помогает разобраться – acupajoe

Смежные вопросы