2015-11-09 4 views
3

Я запутался об этом коде:Confused о время регистрации

#include "stdafx.h" 
#include "std_lib_facilities.h" 

int main() 
{ 
    string name_one; 
    string name_two; 
    string name_three;  

    cout << "Please enter a name: "; 
    cin >> name_one; 
    cout << "\nReading data..."; 

    while (name_one.empty()) 
    { 
     cout << "\nFailed!"; 
     cout << "Please enter a name: "; 
     cin >> name_one; 
     cout << "\nReading data..."; 
    } 

    cout << "Completed!\n"; 

    keep_window_open(); 
    return 0; 
} 

Это очень легко, но когда я его отладки и, например, я вообще ничего не писать, а просто нажать Enter, это не Делать что-нибудь. Просто продолжайте показывать мне мигающее подчеркивание под линией, и если я продолжаю нажимать Enter, он просто прыгает по строкам. Почему программа не читает условие? Я хочу, чтобы, если пользователь ничего не пишет, начинается состояние в while!

ответ

6

Вы используете экстрактор потока, >>, который является форматированной входной функцией . Для многих типов (таких как фундаментальные типы и std::string) они начинаются с пропускания всех пробелов в потоке (1), а затем извлечения символов до тех пор, пока они являются допустимым представлением типа данных, который вы хотите извлечь.

Другими словами, когда вы просто нажимаете Введите на стандартный ввод, в потоке будет только символ новой строки. Новая строка - это пробел, поэтому функция >> по-прежнему застревает в режиме «пропустить начальный пробел». Только когда вы вводите символ без пробелов, будет добавлена ​​вторая часть («извлечь символы и попытаться интерпретировать их как представление извлеченного типа»).

Если вы хотите всегда читать строки, вы можете использовать функция потока getline или функция std::getline. Вы также можете комбинировать их с объектом istringstream для разбора строки.


(1) Такое поведение можно управлять потоком манипуляторов skipws and noskipws, или непосредственно ручья formatting flags.

+0

Хорошо, теперь я понимаю, очень ясный thx Angew! – RavenJe