2014-01-23 160 views
0

我有一個函數在輸入驗證後被調用。 它會檢查分組大小的數字範圍,它們不能小於1且不大於10,我也正在驗證它用於無效字符,如字母和符號。while循環中的多個條件C++

int validateGroupSize(int groupsize[], int i) 
    {          

    while((groupsize[i] < 0 || groupsize[i] > 11) || (!(cin >> groupsize[i]))){ 
      cout << string(60, '\n'); 
      cout << "Please re-enter customer's group size. " << endl << "Input must be a number and must not be smaller than 1 and greater than 10: " << endl; 
      cin >> groupsize[i]; 
      cin.clear(); 
      cin.ignore(20, '\n'); 

      } 

    return groupsize[i];    

    } 


    int main() 
    { 

    int groupsize[10]={0,0,0,0,0,0,0,0,0,0};  
    int i; 
    char newentry='n'; 

    do{ 

     cout << string(60, '\n'); 
     cout << endl << endl << "Please enter customer's group size: " << endl; 
     groupsize[i]=validateGroupSize(groupsize, i); 

     i++; 

    cout << "Would you like to enter another questionare? Enter either 'y' or 'n': " << endl; 
    cin >> newentry; 

    }while((newentry =='y') || (newentry=='Y')); 

    system("pause"); 
    return 0; 
    } 

到目前爲止程序工作的無效字符,因爲當我輸入一個字母,它會提示我的錯誤信息。不幸的是,當我輸入一個大於10的數字時,它會簡單地忽略條件並繼續執行程序的其餘部分。我做錯了什麼?

+1

主要是什麼'i'? – P0W

+0

這應該從來沒有編譯過。 – Panzercrisis

+0

對不起,我忘了在這裏添加int i。我在int main的while循環中找到i ++來計算它循環了多少次。 – noobuser333

回答

2

主要問題是您的代碼使用未初始化的變量i來訪問groupsize的數組元素。這樣做會在你的程序上調用Undefined Behavior,使得任何由此產生的不需要的行爲都在編譯器的權限之內。

第一個地方發生這種情況是這一行:

groupsize[i] = validateGroupSize(groupsize, i); 
^^^^^^^^^^^^ 

i應在施工被初始化爲0因此上述線路將是有效的。此外,它會使後續的增量i也有效。


裏面你validateGroupSize()功能的條件是:

while ((groupsize[i] < 0 || groupsize[i] > 11) || (!(cin >> groupsize[i])) 

因爲你值已經提取到數組元素之前執行驗證約束這是不對的。如果groupsize在此代碼之前未被賦予默認值(全爲0),則此代碼將成爲未定義行爲的另一個候選項。

要解決這個問題,只需交換兩個條件:使提取發生在實際驗證之前。

最後,刪除嵌套cin >> groupsize[i]。如果參數中的條件返回true,並且循環沒有中斷,則當循環再次執行時將執行提取。


更新:正如@JohnnyMopp指出的那樣,您的驗證條件應改爲他所顯示的內容。

+0

非常感謝你和@JohnnyMopp。現在它工作正常。在編程方面,我仍然是一個新手。非常有幫助,現在我明白我的問題是什麼。再次感謝! – noobuser333

0

首先,如果你想1 < = GROUPSIZE < = 10,您的測試應該是: groupsize[i] < 1 || groupsize[i] > 10

while(!(cin >> groupsize[i]) || groupsize[i] < 1 || groupsize[i] > 10){ 
    cin.clear(); 
    cin.ignore(20, '\n'); 
    cout << "Please re-enter customer's group size. " << endl << "Input must be a number and must not be smaller than 1 and greater than 10: " << endl; 
} 

編輯:重新佈置,而根據@聲明0x499602D2的建議。

+0

再次感謝,所有作品吧! – noobuser333