2010-03-05 97 views
4

的錯誤開始於cin.getline(字符串,25, '\ n');或者它下面的行(strtod)。如果我使用cin,它可以工作,但我不能退出。如果輸入任何不是雙精度的東西,就會運行一個無限循環。需要幫忙。基本上,第一次迭代運行,不要求輸入,所以用戶得到錯誤的數學問題。第二次迭代工作正常。接下來也很好。如果我退出,使用q,我會退回到模式選擇器。選擇一種模式後,該錯誤會再次出現在第一次迭代中。接下來的迭代已經結束了。第一次while循環的第一次迭代總是無法輸入。 2+循環做工精細

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; 
} 
+0

強制性鏈接到C++ FAQ精簡版:http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.2 – indiv 2010-03-05 21:12:12

回答

1

問題是這樣的線:

cin >> choice; 

此行解析用於字符輸入可被轉換爲一個整數的輸入緩衝器。所以,如果你輸入:

2<newline> 

字符串「2」轉換,並<newline>保持在輸入緩衝器;所以後續的cin.getline()立即得到滿足。

這也是爲什麼JonH的建議不工作,你需要的cin << choice輸入後清除輸入緩衝區。一個替代方案是使用cin.getline()的所有輸入(或更好;使用::函數getline(),其操作上的std :: string而不是C-字符串),並且然後使用一個std :: istringstream對象時解析該輸入你需要格式化的輸入掃描。

但是如果必須使用cin.ignore()來解決這個問題,你應該這樣做:

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

其中的std :: numeric_limits在頭文件中定義。您的解決方案相信用戶不要輸入超過25個字符。這不是一個非常安全的假設。

+0

我用你的方法,它是完美的。這是非常安全的使用,它工作正常。謝謝。 – Duc 2010-03-06 00:48:34

0

嘗試向右後或cin.getline()之前拋出cin.ignore()

+0

謝謝您的回答。它修復了這個錯誤,但它創造了另一個錯誤。我加了cin.ignore();在cin.getline之後(string,25,'\ n');現在它不會註冊正確的答案。你能解釋一下cin.ignore的功能嗎?我已經讀了一些,但我仍然對它的功能感到困惑。 – Duc 2010-03-05 20:27:17

+1

向下投票,因爲它僅僅是不正確的(即使是低能兒的編輯),而倒像是「猜測」。不要*嘗試*;做。 – Clifford 2010-03-07 08:59:55

+0

@Clifford - 這不是一個猜測,你仍然可以使用cin.ignore()。 -1給你,因爲你的帖子是JUST A GUESS – JonH 2010-03-07 19:21:14

相關問題