C++ Do - While 循环直到字符串满足特定条件
Posted
技术标签:
【中文标题】C++ Do - While 循环直到字符串满足特定条件【英文标题】:C++ Do - While loop until a string meets certain criteria 【发布时间】:2013-05-15 14:53:08 【问题描述】:我要求用户输入,但我希望问题一直显示在屏幕上,直到输入满足允许的输入之一。这是我的代码
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;如果它们是小写的,我也希望它被接受。
每次我运行它时,即使我输入了正确的输入,它也只是不断地输入单词而不做任何其他事情。
【问题讨论】:
【参考方案1】:条件
departure.compare("MAN") != 0 || departure.compare("EMA") != 0 || departure.compare("LHR") != 0
总是为真,无论 departure
是什么。
compare
在相等时返回 0
。所以你基本上告诉编译器的是
在
departure
不同于“MAN”OR 不同于“EMA”OR 不同于“LHR”时运行循环。
【讨论】:
还有其他方法可以将出发时间与这些字符串进行比较吗? @MrHeisenbergcompare
是正确的,你只需要重新思考逻辑。不要只是在那里输入&&
,而是要真正尝试理解。【参考方案2】:
你需要 && 而不是 ||在你的情况下。
此条件始终返回 true,因为它不能一次全部为 3。
只要输入是接受的 3 个之一,&& 就会返回 false。
【讨论】:
【参考方案3】:在执行 while(...) 语句中的比较之前,请考虑使用 boost::to_upper 将输入转换为大写。这将解决小写/大写问题。
http://www.boost.org/doc/libs/1_41_0/doc/html/boost/algorithm/to_upper.html
另外,在处理 C++ 字符串时,我建议你干脆这样做
出发 == "人" ||出发 == "EMA" ||出发==“LHR”
您不需要在 C++ 中执行 string.compare,这与其他一些语言(例如 Java)不同,因为 == 运算符被重载来比较字符串的 /content/,而不是字符串对象本身。
还有其他人在比较方法相等时返回 0 的问题上击败了我。
【讨论】:
【参考方案4】:首先,您的 while 循环条件不正确。现在它显示,当离开不是“MAN”或不是“EMA”或不是“LHR”时,继续循环。因为不能同时离开他们三个,所以循环永远不会结束。我建议用 AND (&&) 替换你的 OR (||)
同样,每次执行循环时都需要清除离开时的值,否则之前输入的行仍然存在,即使输入了正确的机场代码,您的比较也会失败。
【讨论】:
【参考方案5】:我们的主要问题是字符串的比较不正确。假设我们输入“MAN”。
如果字符串不是“MAN”,departure.comare("MAN") != 0
将为真。好吧,我们输入了“MAN”,所以它是错误的。现在我们将其与departure.compare("EMA") != 0
或 - 这是真的,因为“MAN”不等于“EMA”。因此,您需要将您的条件与&&
结合起来,而不是||
。
要修复“大写”,有两种选择。要么将输入字符串转换为大写,要么与所有不同的小写和大写组合(Man、MaN、Man等)进行比较——后者很快就会变得非常乏味。
看看这个以不区分大小写的方式比较字符串的一些选项: Case insensitive string comparison C++
【讨论】:
谢谢,但是当我输入错误的输入时,它会进入下一行,有没有办法把它放在问题旁边?以上是关于C++ Do - While 循环直到字符串满足特定条件的主要内容,如果未能解决你的问题,请参考以下文章
在 do while 循环内部,我想在 c# 中每 1 分钟执行一次特定代码,直到条件满足