以前、入力をスキップする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の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;
}
_
_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')新しい文字をキャッチすることでこの問題を解決しました