Есть несколько проблем с 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.
}