В то время как цикл принимает ввод первого и второго cin - PullRequest
1 голос
/ 20 марта 2019

Мое намерение для этих строк кода состояло в том, чтобы создать программу, которая отображала бы, сколько символов имеет фраза, набранная пользователем. Я дополнил свои строки кода еще одной задачей - создать приглашение для пользователя завершить программу или выполнить цикл. Для этого я создал цикл while. Все прошло хорошо, пока мне не предложили «Иди снова?». Независимо от того, какой ввод я набрал, он автоматически выдавал мой вывод для первого ввода, то есть он также принимал ввод для моего первого cin. Для справки это мой код:

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

int main()
{
char again = 'y';
string phrase;
while (again == 'y' || again == 'Y')
{

cout << "Enter your phrase to find out how many characters it is: ";
getline(cin,phrase);
cout << phrase.length() << endl;
cout << "Go again? (y/n) " ;

cin >> again;

}
cout << "The end." << endl;

system ("pause");
}

Извините, если мой вопрос расплывчатый или я использовал неверные термины, я только начал склоняться с ++.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Есть несколько проблем с std::cin << varname.

Когда пользователь вводит «ввод» после входной переменной, cin будет только читать переменную и оставит «ввод» для следующего чтения.

Поскольку вы смешали cin с getline(), вы иногда едите «вход», а иногда нет.

Одним из решений является добавление вызова ignore после вызова cin, чтобы съесть 'enter'

cin >> again;
std::cin.ignore();

Вторым решением является использование std :: getline (). Часто рекомендуется объединять getline () с std :: istringstream. Это альтернативный способ решения этой проблемы с использованием getline () и istringstream. См. Комментарии в коде для объяснений.

#include <iostream>
#include <string.h>
#include <sstream>

int main()
{
  std::string line;
  std::string input;
  std::istringstream instream;

  do {
    instream.clear(); // clear out old errors

    std::cout << "Enter your phrase to find out how many characters it is: "
              << std::endl;

    std::getline(std::cin, line);
    instream.str(line); // Use line as the source for istringstream object

    instream >> input;  // Note, if more than one word was entered, this will
                        // only get the first word

    if(instream.eof()) {
      std::cout << "Length of input word:  " << input.length() << std::endl;

    } else {
      std::cout << "Length of first inputted word:  " << input.length() << std::endl;

    }
    std::cout << "Go again? (y/n) " << std::endl;
  // The getline(std::cin, line) casts to bool when used in an `if` or `while` statement.
  // Here, getline() will return true for valid inputs. 
  // Then, using '&&', we can check
  // what was read to see if it was a "y" or "Y".
  // Note, that line is a string, so we use double quotes around the "y"
  }  while (getline(std::cin, line) && (line == "y" || line == "Y"));

  std::cout << "The end." << std::endl;

  std::cin >> input; // pause program until last input.
}
2 голосов
/ 20 марта 2019

Вы должны добавить std::cin.ignore() после cin>>again.

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

int main()
{
char again = 'y';
string phrase;
while (again == 'y' || again == 'Y')
{

cout << "Enter your phrase to find out how many characters it is: ";
getline(cin,phrase);
cout << phrase.length() << endl;
cout << "Go again? (y/n) " ;

cin >> again;
cin.ignore();
}
cout << "The end." << endl;

system ("pause");
}

Проблема в том, что после std::cin новая строка все еще будет оставаться во входном буфере, а getline() будет читать эту новую строку. std::ignore() просто извлечет символ из входного буфера и сбросит его.

Для получения дополнительной информации см. http://www.augustcouncil.com/~tgibson/tutorial/iotips.html#problems

...