2015-04-21 43 views
1

因此,我將首先說這是我的第一篇文章。我遇到了一些尷尬,無法找到適合我的簡單答案。程序流程問題

我很新,我仍然在命令行程序,但在這裏我想創建一個程序,將接受來自用戶的int值。我想檢查並確認它實際上是一個整數值。如果不是,我希望告訴用戶輸入正確的整數值。如果這是正確的,我想繼續前進。我想繼續詢問正確的輸入,直到用戶給我一個整數值。

這就是我一直試圖做的事:

#include <iostream> 

using namespace std; 

int main() 
{ 

    int n; 

    do { 

     if (isdigit(n)==false) { 
     cout<<"Enter an integer number\n"; 
     cin>>n; 
     continue; 
     } 
     else { 
     cout<<"Good Job\n"; 
     } 
    } while(isdigit(n)==false); 

} 

正如你可能已經猜到這給了我一個無限循環。我不能爲了我的生活得到這個表現我想要的。

+0

看到這個:http://stackoverflow.com/questions/13212043/integer-input-validation-how和這個:http://stackoverflow.com/questions/16934183/integer-validation-for-input – jrd1

+0

@Zack如果你在'n'是一個'int'時檢查'isdigit(n)'是否會失敗並給出錯誤? :) –

+0

謝謝jrd,這有助於指出我正確的方向。可變驗證的整個過程比我想象的要困難得多。 – Zack

回答

3

您正處在正確的軌道上。您正在執行的用於確定整數的檢查是否成功讀取不正確。 isdigit旨在檢查單個字符是否是數字。 isdigit返回true的值的範圍是['0'-'9']。用整數表示,範圍是[48 - 57]。它不適合你的目的。

這裏有一個更新的版本,應該工作:

#include <iostream> 

using namespace std; 

int main() 
{ 

    int n; 
    while (true) 
    { 
     cout << "Enter an integer number\n"; 
     if (cin >> n) 
     { 
     cout<<"Good Job\n"; 
     break; 
     } 
     else 
     { 
     // Clear the stream and ignore the rest of the line. 
     cin.clear(); 
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     } 
    } 
} 
+0

如果我輸入一個非整數,我仍然會以無限循環結束。 – Zack

+0

@Zack,好點。查看關於忽略該行其餘部分的更新代碼。 –

+0

在cin.ignore(...)之前應該有cin.clear();否則循環不會在輸入錯誤時中斷。或者,這可能是MSVC特有的問題! –

2

這裏有幾個問題。

  1. 首先,由於@ jrd1已鏈接,因此您投出cin>>n的方式不完整。您的程序功能似乎需要某種驗證,但如果輸入不是數字,則cin會失敗(請參閱integer input validation, how?Integer validation for input中的cin.fail()的使用)。您必須檢查cin是否失敗,並刷新cin以進行下一輪輸入。

  2. if語句之一,while語句是多餘的,因爲n沒有的whileif評價之間在隨後的循環變化。

  3. 由於您必須檢查cin是否失敗,因此無需額外檢查isdigit(n)。也就是說,如果cin沒有失敗,則n必須是數字。

  4. 您的continue聲明是多餘的。 continue跳到循環結尾,但這不是必須的,因爲所有其餘代碼都位於else塊中,因此沒有任何可跳過的內容。只有在您的if塊(您的代碼沒有)之後跳過任何代碼時,這纔有用。

  5. 您的意圖與else塊似乎表明一個成功的驗證。您可以考慮使用break語句,該語句將代碼執行從當前循環中分離出來。

一旦你考慮到所有這些,你會得到類似@ R-Sahu的代碼。

這是最接近您的代碼示例:

#include <iostream> 

using namespace std; 

int main() { 

    int n; 

    do { 
     cout<<"Enter an integer number\n"; 
     cin>>n; 

     if(cin.fail()) { 
      cout << "Wrong Input" <<endl; 
      cin.clear(); 
      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     } else { 
      break; 
     } 

    } while (true); 

    cout<<"Good Job\n"<<endl; 

} 

下面是另一個例子是「更多」精簡,並且不需要breakcontinue語句(爲了更好的「可讀性」代碼文體選擇通過一些程序員)

#include <iostream> 

using namespace std; 

int main() { 

    int n; 

    cout << "Enter an integer number\n" << endl; 
    cin>>n; 
    while (cin.fail()){ 
      cout << "Wrong Input. Enter an integer number\n" <<endl; 
      cin.clear(); 
      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
      cin>>n; 
    } 

    cout<<"Good Job\n"<<endl; 

} 

編輯:固定在! cin>>n如預期沒有表現的第二個例子中的問題。

EDIT2:修正了isdigit錯誤應用的第一個示例中的問題。見R Sahu的解釋。

0

感謝您的幫助,我終於能夠使用ch41rmn的建議稍微修改後的版本來運行代碼。 「簡化」版本直接繞過while循環。即使給出了正確的int值,第二個也不會退出。這是我用的:

#include <iostream> 

using namespace std; 

int main() { 

    int n; 

    do { 
     cout<<"Enter an integer number\n"; 
     cin>>n; 

     if(cin.fail()) { 
      cout << "Wrong Input" <<endl; 
      cin.clear(); 
      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     } 
     else{ 
      break; 
     } 

    } while(isdigit(n)==false); 

    cout<<"Good Job\n"; 

} 

雖然這可能是相當多餘的,我很高興SOB運行。

謝謝!