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;
这个\n
被createNewCustomer()
下一个getline消耗掉了。 你应该使用getline来代替 –
do { system("cls"); manageCustomerMenu(); getline(cin, choice) system("cls"); switch (choice) { case '1': createNewCustomer(); break;
我认为这将解决这个问题。
我面临这个问题,并解决了这个问题,使用getchar()来捕获('\ n')新的字符