我有一个在输入验证后调用的函数。 它将检查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的数字时,它将忽略该条件并继续执行该程序的其余部分。我做错了什么?
答案 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的建议重新安排声明。