首先,while循环的第一次迭代总是无法获取输入。 2 +循环工作正常

时间:2010-03-05 20:12:25

标签: c++ input cin

错误从cin.getline开始(字符串,25,'\ n');或它下面的线(strtod)。如果我使用cin,它可以工作,除了我不能退出。如果我输入任何不是双精度的东西,就会运行无限循环。需要帮忙。基本上,第一次迭代运行,不要求输入,因此用户得到错误的数学问题。第二次迭代工作正常。而下一个也很好。如果我退出,使用q,我会被转回模式选择器。选择模式后,错误会在第一次迭代时重新出现。下一次迭代它已经消失了。

int main()
{
    char choice, name[25], string[25], op;
    int operator_number, average, difference, first_operand, second_operand, input, answer, total_questions = 0, total_correct = 0;
    double dfirst_operand, dsecond_operand, dinput, danswer, percentage;
    bool rounding = false;

    srand ( time(NULL) );

    cout << "What's your name?\n";
    cin.getline ( name, 25, '\n' );
    cout << '\n' << "Hi, " << name << ".";

    do {
    do {
    cout << "\nWhich math operations do you want to practice?\n  1. Addition\n  2. Subtraction\n  3. Multiplication\n  4. Division\n  5. Mixed\n  6. Difference of squares multiplication.\nChoose a number (q to quit).\n";
    cin >> choice;
    } while( choice < '1' || choice > '6' && choice!= 'q');

    cout << "\n";

    switch(choice) {
    case '1':
            while( string[0]!= 'q') {
                dfirst_operand = rand() % 15 + 1;
                dsecond_operand = rand() % 15 + 1;
                danswer = dfirst_operand + dsecond_operand;
                cout << dfirst_operand << " + " << dsecond_operand << " equals?\nEnter q to quit.\n";
                cin.getline ( string, 25, '\n' );
                dinput = strtod( string,NULL);
                //cin >> dinput;
                if(string[0]!='q') {
                ++total_questions;
                if(dinput==danswer) {
                    ++total_correct;
                    cout << "Correct. " << total_correct << " correct out of " << total_questions << ".";
                } else {
                    cout << "Wrong. " << dfirst_operand << " + " << dsecond_operand << " equals " << danswer << ".\n" << total_correct << " correct out of " << total_questions << ".";
                };
                percentage = floor(10000 * (float) total_correct / total_questions)/100;
                cout << ' ' << percentage << "%.\n\n";
                }
            }
            break;
            }
    } while(choice!='q');
    return 0;
}

2 个答案:

答案 0 :(得分:1)

问题在于这一行:

 cin >> choice;

此行解析输入缓冲区中可以转换为整数的字符输入。所以如果你输入:

2<newline>

转换字符串“2”,<newline>保留在输入缓冲区中;所以后续的cin.getline()会立即得到满足。

这也是为什么JonH的建议不起作用,你需要在 cin << choice输入后清除输入缓冲区。另一种方法是对所有输入使用cin.getline()(或更好;使用:: getline()对std :: string而不是C-strings进行操作),然后使用std :: istringstream对象解析该输入你需要格式化的输入扫描。

但是如果你必须使用cin.ignore()来解决这个问题,你应该这样做:

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

其中std :: numeric_limits在标头中定义。您的解决方案信任用户不要输入超过25个字符。这不是一个非常安全的假设。

答案 1 :(得分:0)

尝试在cin.ignore()之后或之前抛出cin.getline()