0

我要求用户输入,但我希望问题一直显示在屏幕上,直到输入满足允许的输入之一。这是我的代码

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;如果它们是小写的,我也希望它被接受。

每次我运行它时,即使我输入了正确的输入,它也只是不断地输入单词而不做任何其他事情。

4

5 回答 5

3

条件

 departure.compare("MAN") != 0 || departure.compare("EMA") != 0 || departure.compare("LHR") != 0

永远是真的,不管是什么departure

compare平等回报0。所以你基本上告诉编译器的是

departure在不同于“MAN”不同于“EMA”不同于“LHR”时运行循环。

于 2013-05-15T14:56:39.807 回答
1

你需要 && 而不是 || 在你的情况下。

此条件始终返回 true,因为它不能一次全部为 3。

一旦输入是接受的 3 个之一, && 将返回 false。

于 2013-05-15T14:58:02.347 回答
1

在执行 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 的比较方法击败了我。

于 2013-05-15T14:59:13.133 回答
0

首先,您的 while 循环条件不正确。现在它显示,当离开​​不是“MAN”或不是“EMA”或不是“LHR”时,继续循环。因为不能同时离开他们三个,所以循环永远不会结束。我建议用 AND (&&) 替换你的 OR (||)

同样,每次执行循环时,您都需要清除离开时的值,否则之前输入的行仍然存在,即使输入了正确的机场代码,您的比较也会失败。

于 2013-05-15T15:00:01.423 回答
0

我们的主要问题是字符串的比较不正确。假设我们输入“MAN”。

departure.comare("MAN") != 0如果字符串不是“MAN”,则为真。好吧,我们输入了“MAN”,所以它是错误的。现在我们将其与departure.compare("EMA") != 0- 进行或,这是真的,因为“MAN”不等于“EMA”。所以你需要结合你的条件&&,而不是||

要修复“大写”,有两种选择。要么将输入字符串转换为大写,要么与所有不同的小写和大写组合(Man、MaN、Mann 等)进行比较——后者很快就会变得非常乏味。

看看这个以不区分大小写的方式比较字符串的一些选项: 不区分大小写的字符串比较 C++

于 2013-05-15T15:04:45.033 回答