Вход cin и getline
ранее я разместил вопрос о cin
пропуске ввода, и я получил результаты для очистки и использовал istringstream
, но теперь я пробовал все возможные решения, но никто из них не работает.
вот мой код:
void createNewCustomer () {
string name, address;
cout << "Creating a new customer..." << endl;
cout << "Enter the customer name: "; getline(cin, name);
cout << "Enter the customer address: "; getline(cin, address);
Customer c(name, address, 0);
CustomerDB::addCustomer(c);
cout << endl;
}
но я все равно получаю то же самое, пропуская ввод, и когда он принимает входные данные, он берет их и сохраняет в имени ничего пустого, а в адресе он берет то, что я написал, но от 2-й буквы до конец
что не так с моим кодом?
Я попробовал cin.ignore()
, cin.get()
и cin.clear()
все их вместе и один, ни один из них не работал
EDIT:
Основной метод в 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');
}
i выберет 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 name: "; cin.getline(name,256);
cout << "Enter the customer address: "; cin.getline(address,256);
Customer c(name, address, 0);
CustomerDB::addCustomer(c);
cout << endl;
}
Ответы
Ответ 1
Если вы используете 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
Ответ 2
Структура вашего кода меню - проблема:
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.
Ответ 3
Здесь '\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;
Я думаю, что это решит проблему.
Ответ 4
Я столкнулся с этой проблемой и разрешил эту проблему, используя getchar(), чтобы поймать ('\n') новый char