2014-01-23 732 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