簡體   English   中英

使用Switch C ++從用戶獲取輸入

[英]Getting input from user with Switch C++

我有一個系統,用戶可以根據需要輸入盡可能多的輸入並進行一些計算。

這是完成此任務的代碼:

int main() {
    char op = 's';
    float time=0, fuel_rate=0, start=0, end=0, pace=0;


    while(op != 'x'){
        cout << "Please select: " << endl;
        cout << "1 ---> A" << endl;
        cout << "2 ---> B" << endl;
        cout << "3 ---> Calculate" << endl;
        cout << "x ---> Exit" << endl;

        op = std::getchar();

        //remove the rest of the line from input stream
        int temp;
        while ( (temp = std::getchar()) != '\n' && temp != EOF );

        switch(op){
        case '1':
            cout << "Enter time: ";
            cin >> time;
            cout << "Enter fuel rate: ";
            cin >> fuel_rate;
            break;
        case '2':
            cout << "Enter start: ";
            cin >> start;
            cout << "Enter end: ";
            cin >> end;
            cout << "Enter pace: ";
            cin >> pace;
            cout << "Enter fuel rate: ";
            cin >> fuel_rate;
            break;
        case '3':
            cout << "Total value";
            break;
        case 'x':
            return 0;
        default:
            continue;
        }
    }
    return 0;
}

系統對於第一個輸入效果很好。 樣本控制台日志如下所示:

 Please select: 
1 ---> A
2 ---> B
3 ---> Calculate
x ---> Exit
1
Enter time: 2
Enter fuel rate: 3
Please select: 
1 ---> A
2 ---> B
3 ---> Calculate
x ---> Exit
2
Please select: 
1 ---> A
2 ---> B
3 ---> Calculate
x ---> Exit

第一個用戶進入操作1,系統要求時間和燃油費。 當用戶進入操作2時,系統不要求輸入開始,結束或速度。

關於如何解決這個問題的任何想法?

我相當確定std::getchar()是大多數問題的原因。 如果我將您的代碼更改為使用:

cin >> op;
switch (op) { 
//...

代替

op = std::getchar();

//remove the rest of the line from input stream
int temp;
while ( (temp = std::getchar()) != '\n' && temp != EOF );

switch(op){
//...

該程序運行正常。

您正在混合使用std::cinstdin 您應該堅持其中之一。 代替

    op = std::getchar();

采用

    op = cin.get();

您應該移動以下行:

    int temp;
    while ( (temp = std::getchar()) != '\n' && temp != EOF );

switch塊結束之后,請確保使用temp = cin.get()

由於您正在使用operator>>()讀取數據,因此輸入流中會保留未使用的換行符,例如:

    cin >> fuel_rate;

將調試打印代碼添加到交換機的默認情況下,可以清楚地了解發生了什么:

// ...
default:
  cout << "unexpected: " << int(op) << endl;
  continue;
// ...

意外:10

使用std::cin上的operator>>格式化輸入后,小數點10是換行符\\n仍在輸入緩沖區中。

要更正此問題,您可以在執行格式化輸入后,從流中忽略剩余字符(想一想當用戶在輸入請求時未輸入數字時會發生什么),包括下一個換行符:

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

或使用格式化的輸入(可自行跳過):

cin >> op;

盡管您還需要注意文件結束條件,但是您的當前代碼無法執行上述操作,如您在上面的示例中看到的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM