我要求用户输入,但我希望问题保持在屏幕上,直到输入符合允许的输入之一。这是我的代码
string input = "";
string departure = "";
cout << "Please enter an airport code: ";
do
{
getline(cin,input);
stringstream(input) >> departure;
} while(departure.compare("MAN") != 0 || departure.compare("EMA") != 0 || departure.compare("LHR") != 0 );
}
我希望它循环直到用户输入MAN或EMA或LHR;如果它们是小写的,我也希望它能被接受。
每次我运行它,即使我输入了正确的输入,它也只是继续输入文字而不做任何其他操作。
答案 0 :(得分:3)
条件
departure.compare("MAN") != 0 || departure.compare("EMA") != 0 || departure.compare("LHR") != 0
无论departure
是什么,始终为真。
compare
在平等时返回0
。所以你基本上告诉编译器的是
当
departure
与“MAN” OR 不同于“EMA” OR 与“LHR”不同时运行循环。
答案 1 :(得分:1)
在while(...)语句中执行比较之前,请考虑使用boost :: to_upper将输入转换为大写。这将解决小写/大写问题。
http://www.boost.org/doc/libs/1_41_0/doc/html/boost/algorithm/to_upper.html
另外,在处理C ++字符串时,我建议您只需执行
出发==“MAN”||出发==“EMA”||出发==“LHR”
您不需要在C ++中执行string.compare,这与其他语言(例如Java)不同,因为==运算符被重载以比较字符串的/ content /,而不是字符串对象本身。
另外有人打败了我,因为比较方法在相等时返回0。
答案 2 :(得分:0)
你需要&amp;&amp;而不是||在你的条件下。
这个条件总是返回true,因为它不能同时全部为3。
&amp;&amp;输入是接受的3之一后,将返回false。
答案 3 :(得分:0)
首先你对while循环的条件不正确。现在它读取,虽然离开不是'MAN'或不是“EMA”或不是“LHR”,继续循环。因为离开并不是所有三个同时出现,所以循环永远不会结束。我建议用AND(和&amp;&amp;)
替换你的OR(||)同样,每次执行循环都需要在离开时清除值,否则先前输入的行仍然存在,即使输入正确的机场代码,您的比较也会失败。
答案 4 :(得分:0)
我们的主要问题是字符串被错误地比较。假设我们输入“MAN”。
如果字符串不是“MAN”,则departure.comare("MAN") != 0
将为true。好吧,我们输入“MAN”,所以这是假的。现在我们用departure.compare("EMA") != 0
或者那个 - 这是真的,因为“MAN”不等于“EMA”。所以你需要用&&
而不是||
来梳理你的状况。
要修复“owercase”,有两种选择。将输入字符串转换为大写,或者与大小写(Man,MaN,mAn等)的所有不同组合进行比较 - 后者非常快速地变得非常繁琐。
请看一下这个以不区分大小写的方式比较字符串的一些选项: Case insensitive string comparison C++