Почему это пока l oop не заканчивается в приведенном ниже коде? - PullRequest
2 голосов
/ 26 мая 2020

Извините, этот код кажется глупым, но я просто хочу получить лог c.

Я пытаюсь завершить программу, когда пользователь вводит quit в качестве ввода.

Я написал name != "quit" && sname != "quit" как условие while, поэтому, если любое из них равно quit, l oop закончится (верно?).

Но когда я пишу quit как name, он по-прежнему ожидает ввода sname, если я напишу quit также для ввода 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=

Ответы [ 4 ]

5 голосов
/ 26 мая 2020

Хороший вопрос! Это связано с тем, как работают циклы while.

В C ++, while l oop работает следующим образом:

  • Сначала он проверяет, выполняется ли условие в выражение в скобках в while l oop истинно.
  • Если это так, он выполняет все тело while l oop, а затем возвращается к нему первый шаг.

Другими словами, while l oop не прекратит работу, как только условие станет ложным. Скорее, он прекращает работу, когда доходит до точки, в которой он повторно оценивает условие и обнаруживает, что оно ложно.

Вот почему не имеет значения, используете ли вы здесь && или ||. L oop не выйдет, пока условие не будет проверено снова, и этого не произойдет, пока не завершится текущая итерация l oop.

Это оставляет вам несколько вариантов того, что делать .

  1. Вы можете добавить явную проверку в while l oop после прочтения первой строки, чтобы подтвердить, что строка не "quit", выполняя только остальную часть l oop, если вам нужно.

  2. Вы можете добавить оператор break в середину l oop, чтобы сообщить l oop о прекращении работы. Это можно сделать в сочетании с опцией (1).

Надеюсь, это поможет!

2 голосов
/ 26 мая 2020

В то время как l oop, он выполняет проверку каждый раз после ввода и имени и фамилии, это означает, что он будет проверять только после того, как вы введете фамилию. Вы можете сделать это:

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

что-то вроде этого. :)

1 голос
/ 26 мая 2020

Как do c say:

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 для разрыва l oop в любое время. Также укажите конечный символ в 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;
}
0 голосов
/ 26 мая 2020

Потому что, когда вы вводите name = "quit", это последний раз, когда l oop работает. И все операторы внутри while l oop выполняются. так Фамилия печатает.

...