Ввод cin и getline
Ранее я отправил вопрос о cin
пропуская ввод, и я получил результаты для очистки и использования istringstream
, но сейчас я попробовал все возможные решения, но ни одно из них не сработало.
вот мой код:
void createNewCustomer () {
string name, address;
cout << "Creating a new customer..." << endl;
cout << "Enter the customer's name: "; getline(cin, name);
cout << "Enter the customer's address: "; getline(cin, address);
Customer c(name, address, 0);
CustomerDB::addCustomer(c);
cout << endl;
}
но я все еще получаю то же самое, пропуская ввод, и когда он принимает ввод, он берет их и сохраняет в имени пустое имя, а в адресе он берет то, что я написал в имени, но от 2-й буквы до конца
что не так с моим кодом?
Я попробовал cin.ignore()
, cin.get()
, а также cin.clear()
все они вместе и одни, ни один из них не работал
РЕДАКТИРОВАТЬ:
Основной метод в main.cpp вызывает mainMenu()
только
void mainMenu () {
char choice;
do {
system("cls");
mainMenuDisplay();
cin >> choice;
system("cls");
switch (choice) {
case '1':
customerMenu();
break;
case '2':
dvdMenu();
break;
case '3':
receiptMenu();
break;
case '4':
outro();
break;
default:
cout << '\a';
}
cin.ignore();
cin.get();
} while (choice != '4');
}
я выберу 1 для примера клиента, это customerMenu()
void customerMenu () {
char choice;
do {
system("cls");
manageCustomerMenu();
cin >> choice;
system("cls");
switch (choice) {
case '1':
createNewCustomer();
break;
case '2':
deleteCustomer();
break;
case '3':
updateCustomerStatus();
break;
case '4':
viewCustomersList();
break;
case '5':
mainMenu();
break;
default:
cout << '\a';
}
cin.ignore();
cin.get();
} while (choice != '5');
}
Я снова выбираю 1, чтобы создать новый объект клиента, который теперь перейдет в MainFunctions.cpp, который вызовет функцию createNewCustomer()
который является первым.
void createNewCustomer () {
string name, address;
cout << "Creating a new customer..." << endl;
cout << "Enter the customer's name: "; cin.getline(name,256);
cout << "Enter the customer's address: "; cin.getline(address,256);
Customer c(name, address, 0);
CustomerDB::addCustomer(c);
cout << endl;
}
4 ответа
Если вы используете getline
после cin >> something
, вам нужно очистить новую строку из буфера между ними.
Мой личный фаворит для этого, если никакие символы после новой строки не нужны cin.sync()
, Однако это определяется реализацией, поэтому может работать не так, как для меня. Для чего-то твердого, используйте cin.ignore()
, Или использовать std::ws
при необходимости удалить начальные пробелы:
int a;
cin >> a;
cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
//discard characters until newline is found
//my method: cin.sync(); //discard unread characters
string s;
getline (cin, s); //newline is gone, so this executes
//other method: getline(cin >> ws, s); //remove all leading whitespace
Структура вашего кода меню является проблемой:
cin >> choice; // new line character is left in the stream
switch ( ... ) {
// We enter the handlers, '\n' still in the stream
}
cin.ignore(); // Put this right after cin >> choice, before you go on
// getting input with getline.
Я столкнулся с этой проблемой и решил эту проблему, используя getchar(), чтобы поймать ('\n') новый символ
Здесь '\n'
оставленный cin, создает проблемы.
do {
system("cls");
manageCustomerMenu();
cin >> choice; #This cin is leaving a trailing \n
system("cls");
switch (choice) {
case '1':
createNewCustomer();
break;
это \n
потребляется следующей getline в createNewCustomer()
, Вы должны использовать getline вместо -
do {
system("cls");
manageCustomerMenu();
getline(cin, choice)
system("cls");
switch (choice) {
case '1':
createNewCustomer();
break;
Я думаю, что это решит проблему.