2017-02-10 53 views
1

我有一個程序可以做三件事。詢問你想要多少個變量,要求你輸入每個變量,然後將其存儲在一個向量中。我已經放了一些代碼來檢查您的輸入是否正確,如果不正確,請重新循環代碼以詢問您的變量。我遇到的問題是,當你在第二個變量周圍輸入任何東西時,它會要求你無限次地嘗試。無論你輸入什麼內容,爲什麼while循環都輸出相同的內容?

舉例來說,如果我輸入這些值輸入:

Variable amount: 5 
Please input variable 1: 8 
Please input variable 2: 8 

ERROR, PLEASE ENTER ONLY VALID SYMBOLS 
--------------------- 

Please input variable 2: 

這樣可以保證輸出ERROR, PLEASE ENTER ONLY VALID SYMBOLS一遍又一遍,不管你輸入的內容。代碼在下面,如果你對這個問題有更好的名字,請告訴我。 (我真的不知道該怎麼稱呼它)

#include <iostream> 
#include <cmath> 
#include <string> 
#include <algorithm> 
#include <vector> 
#include <sstream> 

using namespace std; 

int inputErrorMessage() 
{ 
    cout << "\n ERROR, PLEASE ENTER ONLY VALID SYMBOLS \n"; 
    cout << "--------------------- \n"; 

    return 0; 
} 

int main() 
{ 
    // Declare the variables, vectors, etc. 
    int varNum = 1; 
    int totVar = 0; 
    int choice = 0; 
    vector<int> userNums; 
    double input = 0; 
    string checktotVar = ""; 
    string checkInput = ""; 
    string sym = ""; 
    bool valid = false; 
    stringstream sstotVar; 
    stringstream ssinput; 

    if (choice != 6) { 

     while (!valid) { 

      valid = true; 

      // Ask user for how many variables they want then record it 
      cout << "Variable amount: "; 
      getline(cin, checktotVar); 
      sstotVar << checktotVar; 
      sstotVar >> totVar; 

      if (sstotVar.fail() || totVar <= 0) { 
       inputErrorMessage(); 
       valid = false; 
       sstotVar.clear(); 
       sstotVar.ignore(); 
      } 
     } 

     valid = false; 

     while (!valid) { 

      valid = true; 

      // Ask the user for each variable, then record it into the array 
      for (int i = 0; i < totVar; ++i) { 
       cout << "Please input variable " << varNum << ": "; 
       getline(cin, checkInput); 
       ssinput << checkInput; 
       ssinput >> input; 

       if (ssinput.fail()) { 
        inputErrorMessage(); 
        valid = false; 
        ssinput.clear(); 
        ssinput.ignore(); 
       } 
       if (valid == true) { 
        userNums.push_back(input); 
        varNum++; 
       } 
      } 
     } 
    } 
} 
+0

我建議你學習如何使用你的調試器。請在將來除了解決這個問題之外,還會幫助你。 – Fureeish

+0

另外,請注意,您不需要在函數的開頭部分聲明所有變量。代碼通常更容易閱讀和理解變量聲明接近它們的使用位置。 –

回答

1
ssinput >> input; 

讀取ssinput一件事權流的結束而離開讀取有效。下一次

ssinput << checkInput; 

無法寫入流,因爲流遇到流的結尾。這意味着讀出也將失敗和

if (ssinput.fail()) { 

進入其中程序清除錯誤

ssinput.clear(); 

然後及時讀取的料流與

ssinput.ignore(); 
結束時 if的主體

重新造成錯誤。

最快溶液:

重新創建

stringstream ssinput; 

在每次循環迭代。所以

stringstream sstotVar; 
//stringstream ssinput; gone from here 

getline(cin, checkInput); 
    stringstream ssinput(checkInput); // and now tighter scope recreated each loop. 
    ssinput >> input; 

而且周圍保持流沒有清空它時它會變得非常,非常大的。

您也可以簡化你的邏輯周圍

while (!valid) { 

,並通過移動讀取驗證到它自己的功能,消除了一些重複的代碼

int getMeANumber(const std::string & message, int min) 

該循環,直到它得到一個數字,然後返回數。例如:

int getMeANumber(const std::string & message, int min) 
{ 
    while (true) 
    { 
     cout << message; 
     string checktotVar; 
     getline(cin, checktotVar); 
     stringstream sstotVar(checktotVar); 
     int totVar; 
     sstotVar >> totVar; 

     if (!sstotVar || totVar <= min) 
     { 
      inputErrorMessage(); 
     } 
     else 
     { 
      return totVar; 
     } 
    } 
} 

現在main這是itty-bitty tiny lil的東西。

int main() 
{ 
    int choice = 0; 
    vector<int> userNums; 

    if (choice != 6) 
    { 
     int totVar = getMeANumber("Variable amount: ", 0); 
     for (int i = 0; i < totVar; ++i) 
     { 
      stringstream varname; 
      varname << "Please input variable " << i+1 << ": "; 
      userNums.push_back(getMeANumber(varname.str(), numeric_limits<int>::min())); 
      // numeric_limits<int>::min requires #include <limits> 
     } 
    } 
} 
1

下面是這段代碼的問題。

在這一部分:

if (valid == true) { 
    userNums.push_back(input); 
    varNum++; 
} 

你忘了添加ssinput.clear()。這將重置流狀態(清除錯誤標誌),否則您將無法再使用它。這就是爲什麼它停止在第二個輸入工作。

此外,即使這個方法有效,您也會將您聲明爲double的變量推回到整數的向量中。如果這是爲了存儲雙變量而不是截斷它們並將它們存儲爲整數,那麼這肯定會導致問題。

1

它應該是:

#include <iostream> 
#include <cmath> 
#include <string> 
#include <algorithm> 
#include <vector> 
#include <sstream> 

using namespace std; 

int inputErrorMessage() 
{ 
    cout << "\n ERROR, PLEASE ENTER ONLY VALID SYMBOLS \n"; 
    cout << "--------------------- \n"; 

    return 0; 
} 

int main() 
{ 
    // Declare the variables, vectors, etc. 
    int varNum = 1; 
    int totVar = 0; 
    int choice = 0; 
    vector<int> userNums; 
    double input = 0; 
    string checktotVar = ""; 
    string checkInput = ""; 
    string sym = ""; 
    bool valid = false; 
    stringstream sstotVar; 
    stringstream ssinput; 

    if (choice != 6) { 

     while (!valid) { 

      valid = true; 

      // Ask user for how many variables they want then record it 
      cout << "Variable amount: "; 
      getline(cin, checktotVar); 
      sstotVar << checktotVar; 
      sstotVar >> totVar; 

      if (sstotVar.fail() || totVar <= 0) { 
       inputErrorMessage(); 
       valid = false; 
       sstotVar.clear(); 
       sstotVar.ignore(); 
      } 
     } 

     valid = false; 

     while (!valid) { 

      valid = true; 

      // Ask the user for each variable, then record it into the array 
      for (int i = 0; i < totVar; ++i) { 
       cout << "Please input variable " << varNum << ": "; 
       getline(cin, checkInput); 
       ssinput << checkInput; 
       ssinput >> input; 

       if (ssinput.fail()) { 
        inputErrorMessage(); 
        valid = false; 

       } 
       if (valid == true) { 
        userNums.push_back(input); 
        varNum++; 
       } 

       ssinput.clear(); 
      } 
     } 
    } 
} 

編輯:你需要清除循環的每個迭代stringstream的,否則,當你抓住下一個你不寫一個空流來自用戶的輸入,這是導致.fail()方法在循環的第一次迭代之後返回true的原因。

+0

添加說明 – Dmihawk

相關問題