while循环C ++中的多个条件

时间:2014-01-23 17:03:40

标签: c++ while-loop operators

我有一个在输入验证后调用的函数。 它将检查groupize中的数字范围,它们不能小于1且不大于10,我也在验证字母和符号等无效字符。

   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的数字时,它将忽略该条件并继续执行该程序的其余部分。我做错了什么?

2 个答案:

答案 0 :(得分: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在此代码之前没有给出默认值(全为零),则此代码将成为未定义行为的另一个候选者。

要解决此问题,只需交换两个条件:在实际验证之前进行提取。

最后,删除嵌套的cin >> groupsize[i]。如果参数中的条件返回true,并且循环没有中断,则在循环再次执行时将执行提取。


更新:正如@JohnnyMopp指出的那样,你的验证条件应该改为他所展示的内容。

答案 1 :(得分:0)

首先,如果你想要1&lt; = groupsize&lt; = 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的建议重新安排声明。