两个问题与此代码:
首先userinput
有一个char类型的。所以当你从一个流中读取时,你读取一个字符(在删除空白后)。因此,当用户键入1<enter>
时,变量userinput
中的字符为'1'。请注意字符'1'
与数字1
不一样。
因此您的测试应该是:
userinput != '1';
其次你的布尔逻辑是错误的。在第一次学习时,有时候更容易将问题陈述为希望可以接受的值的列表(而不是不可接受的值)。
如果userInput有一个您接受的值(任何好值都会使测试失败并因此不会调用错误代码),您希望条件为false。如果你的任何值是有效的,那么第一步是获得真实值。
// If any value is good then true.
userinput == '1' || userinput == '2' || userinput == '3'
要翻转此只需添加一个not
来表达。
if (! (userinput == '1' || userinput == '2' || userinput == '3'))
注:在布尔逻辑
!(A || B) => (!A && !B)
所以你可以重新写上面:
if (userinput != '1' && userinput != '2' && userinput != '3')
我认为这是你的主要错误,你转换的==
为!=
,但没有将||
转换成&&
。
我还建议您可以通过将其转换为基于范围的测试来简化此操作(因为您可能会得到更有效的结果)。
if (userinput < '1' || userinput > '3')
{
// Test Failed.
}
此外,既然你在两个地方进行了测试。你应该把它拉到自己的功能。然后你可以调用这个函数来做测试。
char GetInteger(/* out */ char& usrinput)
{
do
{
cin >> usrinput;
cin.ignore(200,'\n');
if (!isUserInputValid(userinput))
{
cout << "Invalid Input." << userinput << " Try Again\n";
}
} while(!isUserInputValid(userinput));
return userInput;
}
'usrinput'是一个'的std :: string',比较它与'2'是没有意义的:
现在我们可以重新写你的原始功能。 'while(usrinput!<= 2)'是无效的语法,即使它是一个数字。你不能指定你声明为返回'void'的函数的值,因为它没有。 – 2014-10-31 03:05:14
所以我应该改变'usrinput'的数据类型?我怎么会得到它只检查它是0-2的值,没有更多,没有字符? – kuthedk 2014-10-31 03:07:16
这里没有实际的问题。当你按下“提问问题”按钮时,你必须提出一个具体的问题。 – 2014-10-31 06:44:27