【问题标题】:Why is this while loop not ending in the code below?为什么这个while循环没有在下面的代码中结束?
【发布时间】:2020-09-13 15:46:47
【问题描述】:

对不起,这段代码看起来很傻,但我只是想了解一下逻辑。

当用户输入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=

【问题讨论】:

    标签: c++ loops while-loop


    【解决方案1】:

    好问题!这与while 循环的工作方式有关。

    在 C++ 中,while 循环的工作方式如下:

    • 首先,它检查while 循环中括号语句中的条件是否为真。
    • 如果是这样,它会执行while 循环的整个主体,然后跳回到第一步。

    换句话说,while 循环不会在条件为假时立即停止运行。相反,一旦到达重新评估条件并发现它为假的程度,它就会停止运行。

    这就是为什么在这里使用&amp;&amp;|| 并不重要。在再次检查条件之前,循环不会退出,并且在当前循环迭代完成运行之前不会发生。

    这为您提供了一些关于该做什么的选择。

    1. 您可以在读取第一个字符串后向while 循环添加显式检查,以确认该字符串不是"quit",仅在需要时执行循环的其余部分。

    2. 您可以在循环中间添加一个break 语句来告诉循环停止运行。这可以与选项 (1) 结合使用。

    希望这会有所帮助!

    【讨论】:

    • 谢谢,这帮助很大,我修复了代码。但我还有一个困惑。 do-while 保证至少执行一次语句,即使条件为假。在这种情况下,while 也在执行执行,直到它重新评估条件,所以即使一开始条件为假,也会再次完成一次执行。那么它们实际上有什么不同呢?
    【解决方案2】:

    在while循环中,每次输入名字和姓氏后都会进行检查,这意味着它只会在您输入姓氏后进行检查。你可以这样做:

    while (true) {
        getline(cin, name);
        if (name == "quit") break;
        getline(cin, sname);
        if (sname == "quit") break;
    }
    

    类似的东西。 :)

    【讨论】:

      【解决方案3】:

      就像医生说的:

      istream& getline (istream& is, string& str, char delim);
      
      istream& getline (istream& is, string& str);
      
      1. 从 is 中提取字符并将它们存储到 str 中,直到 找到分隔符 delim(或换行符, '\n',代表 (2))。

      2. 如果在 is 中到达文件末尾或者如果 在输入操作过程中出现其他一些错误。

      3. 如果找到分隔符,则将其提取并丢弃(即 没有存储,下一个输入操作将在它之后开始)。

      4. 请注意,调用之前 str 中的任何内容都被替换为 新提取的序列。

      所以:

      使用 if 条件随时中断循环。还要在 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;
      }
      

      【讨论】:

        【解决方案4】:

        因为当你输入 name = "quit" 时,最后一次 while 循环运行。并且 while 循环内的所有语句都会执行。所以姓氏打印出来。

        【讨论】:

          猜你喜欢
          • 2017-04-18
          • 2020-01-17
          • 2017-02-21
          • 2017-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-24
          • 2019-06-16
          相关资源
          最近更新 更多