【问题标题】:Getting input from user with Switch C++使用 Switch C++ 从用户那里获取输入
【发布时间】:2015-09-26 04:20:58
【问题描述】:

我有一个系统,用户可以输入任意数量的输入并进行一些计算。

这里是完成这个任务的代码:

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 时,系统不要求开始、结束或步速。

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: c++ switch-statement


    【解决方案1】:

    我相当肯定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){
    //...
    

    程序运行良好。

    【讨论】:

      【解决方案2】:

      您正在混合使用std::cinstdin。你应该坚持其中之一。而不是

          op = std::getchar();
      

      使用

          op = cin.get();
      

      你应该移动线条:

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

      switch 块结束之后,确保您使用temp = cin.get()

      未使用的换行符留在输入流中,因为您使用operator&gt;&gt;() 读取数据,例如:

          cin >> fuel_rate;
      

      【讨论】:

        【解决方案3】:

        Adding debugging print code 切换到默认情况下可以清楚地显示发生了什么:

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

        意外:10

        小数 10 是换行符 \n,在您使用 operator&gt;&gt;std::cin 进行格式化输入后,它仍在输入缓冲区中。

        要更正此问题,您可以在进行格式化输入后,从流直到并包括下一个换行符,ignore 剩余字符(想想当您请求一个数字时用户没有输入数字时会发生什么) :

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

        或者使用格式化输入(它自己跳过):

        cin >> op;
        

        尽管您还需要处理文件结束条件,但您当前的代码无法按照上面运行的示例执行此操作。

        【讨论】:

          猜你喜欢
          • 2013-09-03
          • 1970-01-01
          • 2019-04-11
          • 1970-01-01
          • 2019-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多