之前我发布了一个关于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;
}
但是我仍然得到相同的东西,跳过输入,当它确实需要输入时,它会将它们和名称中的存储空白,并且在地址中它需要我在名称中写的但是从第二个字母到端
我的代码出了什么问题?
我一起尝试了cin.ignore()
,cin.get()
和cin.clear()
所有这些,但没有一个工作
编辑:
main.cpp中的main方法仅调用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;
}
答案 0 :(得分:77)
如果您在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
答案 1 :(得分:10)
菜单代码的结构是个问题:
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.
答案 2 :(得分:2)
在这里,cin留下的'\n'
正在创造问题。
do {
system("cls");
manageCustomerMenu();
cin >> choice; #This cin is leaving a trailing \n
system("cls");
switch (choice) {
case '1':
createNewCustomer();
break;
\n
中的下一个获取线正在使用此createNewCustomer()
。你应该使用getline -
do {
system("cls");
manageCustomerMenu();
getline(cin, choice)
system("cls");
switch (choice) {
case '1':
createNewCustomer();
break;
我认为这可以解决问题。
答案 3 :(得分:2)
我遇到了这个问题,并使用getchar()解决了这个问题,以捕获('\ n')新char