cin和getline跳过input

早些时候,我发布了一个关于cin跳过input的问题,我得到的结果是刷新,并使用istringstream ,但现在我尝试了所有可能的解决scheme,但没有一个工作。

这里是我的代码:

 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; } 

但我仍然得到同样的东西,跳过input,当它确实需要input时,它将把它们和名字存储在空的地方,并且在地址上,我把它写在名字上,但从第二个字母到结尾

我的代码有什么问题?

我尝试了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'); } 

我将select1作为客户示例,这是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'); } 

我再次select1来创build一个新的客户对象,现在将转到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; } 

如果您在cin >> something后面使用getline ,您需要将新行从中间的缓冲区中移出。

我个人最喜欢这个,如果没有字符通过换行是需要的是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. 

在这里,cin留下的'\n'正在产生问题。

 do { system("cls"); manageCustomerMenu(); cin >> choice; #This cin is leaving a trailing \n system("cls"); switch (choice) { case '1': createNewCustomer(); break; 

这个\ncreateNewCustomer()下一个getline消耗掉了。 你应该使用getline来代替 –

 do { system("cls"); manageCustomerMenu(); getline(cin, choice) system("cls"); switch (choice) { case '1': createNewCustomer(); break; 

我认为这将解决这个问题。

我面临这个问题,并解决了这个问题,使用getchar()来捕获('\ n')新的字符