对不起,这段代码看起来很愚蠢,但我只想了解逻辑。
当用户输入quit
作为输入时,我试图结束程序。
我将name != "quit" && sname != "quit"
写为while条件,因此如果其中任何一个为quit
,循环将结束(对吗?)。
但是当我将quit
写为name
时,它仍然等待sname
输入,如果我也为sname
输入写退出,那么它最终会结束。但是,自从我用quit
编写条件以来,它第一次看到&&
时就结束了吗?
此外,当我用||
编写条件时,我得到相同的输出。为什么会这样?
int main()
{
string name="",sname="";
cout << "enter your name and surname \n";
cout << ">>name=";
getline(cin,name);
cout << ">>surname=";
getline(cin,sname);
while (name != "quit" && sname != "quit")
{
cout << ">>name=";
getline(cin,name);
cout << ">>surname=";
getline(cin,sname);
}
return 0;
}
输出:
enter your name and surname
>>name=John
>>surname=Wick
>>name=quit
>>surname=
答案 0 :(得分:5)
好问题!这与while
循环的工作方式有关。
在C ++中,while
循环的工作方式如下:
while
循环中带括号的语句中的条件是否为真。while
循环的整个过程,然后跳回到第一步。换句话说,一旦条件为假,while
循环就不会停止运行。相反,一旦到达重新评估条件并发现错误的条件,它将停止运行。
这就是为什么在这里使用&&
或||
都没关系的原因。直到再次检查条件后,循环才会退出,直到当前循环迭代运行完毕,循环才会发生。
这为您提供了一些有关操作的选择。
在读取第一个字符串后,可以在while
循环中添加显式检查,以确认该字符串不是"quit"
,仅在需要时执行循环的其余部分
您可以在循环的中间添加一个break
语句,以告知循环停止运行。可以与选项(1)结合使用。
希望这会有所帮助!
答案 1 :(得分:2)
在while循环中,每次输入双方名字和姓氏后,都会进行一次检查,这意味着它也将在您输入姓氏后才进行检查。您可以这样做:
while (true) {
getline(cin, name);
if (name == "quit") break;
getline(cin, sname);
if (sname == "quit") break;
}
类似的东西。 :)
答案 2 :(得分:1)
就像医生说的那样:
istream& getline (istream& is, string& str, char delim);
istream& getline (istream& is, string& str);
从is中提取字符并将其存储到str中,直到 找到定界字符delim(或换行符, '\ n',代表(2))。
如果在is中到达文件末尾或如果 输入操作期间发生其他错误。
如果找到分隔符,则将其提取并丢弃(即 未存储,下一个输入操作将在此之后开始。
请注意,调用之前str中的任何内容都将替换为 新提取的序列。
所以:
在任何时候有条件中断循环时使用。还要在getline中指定结束字符(可选,但要写出)。最后,修剪字符串:
#include <boost/algorithm/string.hpp>
int main() {
string name = "", sname = "";
cout << "enter your name and surname \n";
while (true) {
cout << "name: ";
getline(cin, name, "\n");
name = trim(name);
if (name == "quit") break;
cout << "surname: ";
getline(cin, sname, "\n");
sname = trim(sname);
if (sname == "quit") break;
};
return 0;
}
答案 3 :(得分:0)
因为当您输入名称=“ quit”时,这是上一次循环运行的时间。并且while循环内的所有语句都将执行。所以会打印出姓氏。