2013-08-21 4 views
2

Я создаю простое консольное приложение на C++, которое получает от пользователя строковые и char-данные. Чтобы все было просто, я хотел бы использовать строку и char типы данных для ввода ввода cin to.C++ iostream: Использование ошибок cin >> var и getline (cin, var)

Чтобы получить строку входа, я использую GetLine метод:

string var; 
cin.ignore(); //I used ignore() because it prevents skipping a line after using cin >> var 
getline(cin, var); 

Для получения полукокса входа, я использую CIN >> Var метод:

char var; 
cin >> var; 

Это работает отлично по большей части. Однако, когда я ввожу строку, используя getline, он игнорирует первый символ моей строки.

Можно ли использовать GetLine и CIN >> без использования игнорировать, или метод, который я могу назвать, чтобы убедиться, что мой первый символ не пропустил?

Это полный пример кода, где я использую как GetLine и CIN >>:

string firstName; 
string lastName; 
char gender = 'A'; 

cout << "First Name: "; 
cin.ignore(); 
getline(cin, firstName); 


cout << "Last Name: "; 
cin.ignore(); 
getline(cin, lastName); 

while(genderChar != 'M' && genderChar != 'F') 
{ 
    cout << "Gender (M/F): "; 
    cin >> genderChar; 
    genderChar = toupper(genderChar); 
} 
+0

Я не понимаю, ваши комментарии для cin.ignore(). Основываясь на своем определении api, он отбрасывает первый символ введенной строки, как и сценарий, с которым вы сталкиваетесь сейчас. –

+0

@JinChen извините, исправленный. Я хотел сказать, что если я НЕ использую ignore(), он пропускает строку ввода. – miguelarcilla

+0

все еще странно, cin.ignore() не должен вести себя так. Можете ли вы предоставить больше кода вашей проблемы? –

ответ

4

cin>>var;

хватает только var из буфера, он оставляет \n в буфере, , который немедленно схватил на getline

Итак, следуя просто отлично, (если я понял правильно ваша проблема)

cin>>var; 
cin.ignore();  //Skip trailing '\n' 
getline(cin, var); 

в соответствии с вашим отредактирован пост

Вам не придется применить cin.ignore(); для geline

Это извлекает символы из буфера и сохраняет их в firstName или (lastName) до размежевания характера здесь -newline ('\n').

1

std::cin.ignore() будет игнорировать первый символ вашего входа.

В вашем случае, используйте std::cin.ignore() после std::cin, а затем getline() игнорировать символ новой строки, как:

cin>>ch; 
cin.ignore(); //to skip the newline character in the buffer 
getline(cin,var); 
1

ignore() не пропускает строку, она пропускает символ. Не могли бы вы отправить пример кода и уточнить необходимость cin.ignore()?

+0

Я обновил вопрос с помощью некоторого примера кода :), но я думаю, что мой вопрос стал немного неясным в этом процессе. – miguelarcilla