我是C ++的初学程序员(目前),我有一个概念性的问题。
我正在尝试过滤cin
输入以确保它是01-04之间的一位或两位数整数,如果不是,则产生错误并要求输入新的输入。
我还使用map
为用户提供一个选项列表,在有效选择时,通过几种方法中的任意一种路由输入(整数)以产生相关结果,但我会在其他地方问一个更具体的问题。
我在http://www.cplusplus.com/forum/beginner/26821/找到了一段用于验证输入的代码片段。我得到它,除了在while循环中设置布尔条件的情况。因为我不理解它,所以很难编辑或确保我正在操作它。
以下是示例代码:
int main()
{
int num;
bool valid = false;
while (!valid)
{
valid = true; //Assume the cin will be an integer.
cout << "Enter an integer value: " << endl;
cin >> num;
if(cin.fail()) //cin.fail() checks to see if the value in the cin
//stream is the correct type, if not it returns true,
//false otherwise.
{
cin.clear(); //This corrects the stream.
cin.ignore(); //This skips the left over stream data.
cout << "Please enter an Integer only." << endl;
valid = false; //The cin was not an integer so try again.
}
}
cout << "You entered: " << num << endl;
system("PAUSE");
return 0;
这是我的代码(整个事情,给出上下文)。我不认为它是完整的,我只是想确保我正在使用布尔权。
float _tmain(float argc, _TCHAR* argv[])
{
bool validInput = !true;
map<string,int> Operations;
Operations.insert(pair<string, int>("Addition", 01));
Operations.insert(pair<string, int>("Subtraction", 02));
Operations.insert(pair<string, int>("Multiplication", 03));
Operations.insert(pair<string, int>("Division", 04));
cout << "Welcome to OneOpCalc, what operation would you like to perform?" << endl;
for(map<string, int>::iterator ii=Operations.begin(); ii!=Operations.end(); ++ii)
{
cout << (*ii).second << ": " << (*ii).first << endl;
}
while (!validInput)
{
cin >> operatorSelection;
if (cin.fail() || operatorSelection < 4 || operatorSelection > 1)
{
cout << "Error: Invalid selection. Please choose a valid number." << endl << endl;
cin.clear();
cin.ignore();
}
}
}
while (!valid)
是否意味着“虽然valid
false ”?在我的脑海中,它说“虽然valid
是!valid
”,但这显然是假的。
!valid
视为翻转valid
值的一种方式;没有测试条件。这是使用它来测试欺骗我的条件的语法。换句话说,写while(!valid)
字面意思是while(NOTvalid)
,而不是while(valid==false)
。我无法理解为什么在这种情况下,!valid
读取条件而不仅仅是一点翻转。
答案 0 :(得分:2)
您希望运行循环“,而 不 有效输入”。删除非粗体字,并转换为C ++。
当然,第二种情况不起作用,因为循环内没有任何变化validInput
,所以它保持“无效”,并且循环继续(如果你想设置某些东西{{1}然后false
比bool validInput = !true;
更复杂 - 编译器会做同样的事情,但是读取代码的人必须考虑看看它的作用 - 在阅读代码时思考是一件好事但是编写比必要更复杂的代码并不是一件好事......)。
答案 1 :(得分:2)
!
运算符是逻辑not
,您应该阅读它:while not valid
。你也可以把它写成:
while(valid == false)
或
while(valid != true)
请注意,同样,!=
相当于not equal
。
答案 2 :(得分:2)
在你的代码中,在循环内部,只需添加:
else
validInput = true;
在if
结束括号之后。 一旦用户输入了正确的值,您就想摆脱它。
答案 3 :(得分:2)
while循环有一个条件和一个body,只要条件的计算结果为true,就会执行body。
来自C ++标准:
6.5.1 while语句
在while语句中,重复执行子语句,直到条件(6.4)的值变为 假。测试在每次执行子语句之前进行。
while循环可以具有以下形式之一
while ( condition ) statement
while ( condition )
{
statement(s)
}
答案 4 :(得分:2)
循环(和ifs)由类型为bool
的表达式控制。
在while ( !valid )
中,表达式为!valid
,即运算符
不适用于变量valid
的值。
表达式while ( !valid )
(字面意思)
!valid
(表示“无效”)是真的。
对于其他人来说,你复制的代码非常糟糕。我不会 如果我是你,请以它为例。
至于你自己的代码:
_tmain
对微软来说非常特别。你不想
用它。如果您正在编写控制台应用程序,请使用main
。
(同样适用于_TCHAR
,而不是char
。)
_tmain
和main
都不能返回float
。回报
main
的类型应始终为int
。我不太熟悉
_tmain
,但它是int
或void
。 (可能是int
,如果
你正处于控制台模式程序中。)
!true
是false
。总是。 (编程不同于
现实中。没有maybes。)为什么要更多
比必要复杂吗?
根本不需要flag变量。您 可以写:
cin&gt;&gt; operatorSelection; while(!cin || operatorSelection&gt; 4 || operatorSelection&lt; 1){ // ... }
如果出现错误,您目前只会忽略一个
字符。你可能想要忽略并包括
行结束。
(std::cin.ignore( std::numeric_limits<std::streamsize>::max() );
。
你的if中的条件总是如此。 (见我的 上面的版本。)你期望在哪里找到一个数字 既不小于也不大于一个?
答案 5 :(得分:1)
nijansen忘了添加最优雅的一个
while(!valid)
与其他2个人相同