0

だから私は(y/n)を尋ね続けるためにwhileループを設定しようとしていますが、「y」を押して入力すると、「char itemtitle」をスキップして「double itemprice」にまっすぐ下がるのはなぜですか?私は本当にC ++に慣れていません。助けてください、感謝します

#include <cstdlib>
#include <iostream>
#include <sstream>

using namespace std;

#define tax 9.99
#define shipping ("Free")

void printmessage ()
{
  cout << "*Thanks for your business! We'll ship out your item as soon as possible*\n"
              "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n";
}

int main(int argc, char** argv)
{

   cout << "Write an invoice program and print it to the console.\n";
   cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n;

   cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
           "Welcome to my Pc Store.\n"
           "'Where Technology is served right'\n"
           "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"<< endl;

   char name [256];
   cout << "Enter your full name: ";
   cin.getline (name, 256);

   char organization [256];
   cout << "What's your organization?: ";
   cin.getline (organization, 256);

   char quit = 'y';    
   do {
        char itemtitle [256];
        cout << "Enter name of Laptop you'd like to order: ";
        cin.getline (itemtitle, 256);

        double itemprice;
        cout << "Enter price of item: $";
        cin >> itemprice; 

        int quantity;
        quantity = 1;
        cout << "How many items?: ";
        cin >> quantity;

        if (quantity == 1) {     
            cout << "1 item(s)\n";  
        } else  {
           cout << quantity << " item(s)\n";
        } 

        cout << "Tax: $" << tax;

        double subtotal;
        subtotal = quantity * itemprice + tax;
        cout << "\nSub Total: $" << subtotal;

        cout << "\n";       
        cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n"
               "Validation:\n\n";

        cout << "Item(s):\t\t\t\t\t" << "Amount:\n";       
        cout << itemtitle << "\t\t\t\t\t$" << quantity * itemprice + tax; ;
        cout << "\n" << quantity << " * $" << itemprice << " + $" << tax;

        cout << "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n";
        cout << "Payment (Credit/Debit only)!\n\n";

        double cardnum;
        cout << "Card Numbers: ";
        cin >> cardnum;

        int ssn;
        cout << "SSN: ";
        cin >> ssn;

        cout << "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
               "Invoice Details:\n\n";

        time_t rawtime;
        struct tm * timeinfo;
        time ( &rawtime );
        timeinfo = localtime ( &rawtime );
        cout << "Date&Time: " << ("Current local time and date: %s", asctime (timeinfo));

        cout << name;
        cout << "\n" << organization;
        cout << "\n" << "("<< quantity << ")" << " " << itemtitle;

        cout << "\n\t\t\t" << "Total: $" << quantity * itemprice;
        cout << "\n\t\t\t" << "Tax: $" << tax;
        cout << "\n\t\t\t" << "Shipping: " << shipping;
        cout << "\n\n\t\t\t" << "Balance Due: $" << quantity * itemprice + tax;

        cout << "\n\t\t\t" << "Payment: " << "Paid" ;

        cout << "\n\n\nDo you want to continue shopping? (y/n): ";
        cin >> quit ;

        cout << "\n\n";

    } while (quit != 'n');

    cout << "\n\n\n";
    printmessage ();

    return 0;
}
4

2 に答える 2

2

std::cin.operator>>()は文字をバッファに残し、'\n'ではほとんど使用できなくなりgetlineます。どちらかを選択して、それに応じてコードを変更する必要があります。

たとえば、 only を使用getlineして、結果の文字列を内部で解析します。

于 2013-02-22T19:51:05.290 に答える
0

「cin >>」と「cin.getline()」の両方を使用してユーザー入力から読み取る場合、ほとんどこの問題が発生します。">>" 演算子を使用すると、入力を読み取った後、入力ストリームに '\n' が残り、次の "getline" の呼び出しがすぐに返されるようです。

2 つのソリューション。

まず、「cin.ignore();」を追加します。「cin.getline(itemtitle, 256);」の前。「cin.ignore()」は、入力シーケンスから文字を抽出して破棄します。入力ストリームをクリアします。

次に、「cin.getline(itemtitle, 256);」を置き換えます。「cin >> itemtitle;」で。コードで「cin.getline」または「cin >>」のいずれかを使用することをお勧めしますが、両方を使用しないでください。「cin >>」の方がいいでしょう。

また、コードの先頭に「#include < ctime >」を追加する必要があります。

于 2013-02-22T20:05:59.063 に答える