Никогда не используйте iostreams без проверки ошибок.Как говорит Джейсон, прочитайте всю строку, а не только один токен, но даже тогда проверяйте наличие ошибок:
std::string line;
if (std::getline(std::cin, line))
{
std::string h, w;
std::istringstream iss(line);
if (iss >> h >> w)
{
// success
}
else
{
std::cerr << "Error reading your input.\n";
}
}
else
{
std::cerr << "Error reading from stdin!\n";
}
Вы можете превратить if
в циклы, если хотите продолжить чтение.
По сути, вы можете проверить каждое отформатированное извлечение (getline
, >>
) как условие, поскольку результат может быть преобразован во что-то проверяемое, и условие будет false
, если операция не удалась.Следовательно, вы никогда не должны интерпретировать предполагаемые переменные получателя, если операция не была выполнена успешно!
Если бы вы добавили эту проверку к своему коду x >> h >> w;
, вы бы никогда не прошли эту строку без ошибок.