Я в основном хочу проверить, что у меня есть int, а не число с плавающей запятой. У меня в настоящее время есть:
int den1;
cout << "Enter denominator of first fraction" << endl;
cin >> den1;
while (den1 == 0){
cout << "Enter a non-zero denominator" << endl;
cin >> den1;
}
Есть ли "тест" для генерации логического значения для den1 == int? Я пытаюсь избежать использования getline(), потому что я не хочу использовать строку, если она не нужна.
Если вы хотите, чтобы ваш ввод имел целочисленный тип, используйте для этого ввод целого типа. Если den1
является int
, он не позволит вам вставить в него значение с плавающей запятой. То есть, cin >> den1
будет значением int
. Если пользователь пытается ввести 3.14159
, только 3 будет прочитан (он прекратит чтение на .
. Обратите внимание, что остальная часть буфера будет содержать цифры, так что если вы не ясно, что, следующая попытка чтения целое число будет читать 14159
.
РЕДАКТИРОВАТЬ
Если вы хотите "заставить" пользователя ввести действительное целое число, вы можете сделать что-то вроде этого:
std :: строка строки;
int value = 0;
bool valid = false;
do
{
if (std::getline(std::cin, line))
{
if (std::string::npos == line.find('.'))
{
// no decimal point, so not floating point number
value = std::stol(line);
valid = true;
}
else
{
std::cin.clear();
}
}
} while (!valid);
Который много дополнительного кода по сравнению с:
int value;
std::cin >> value;
std::getline
с std::string
а затем преобразовать числа ... но это не нужно.
Прежде всего, пользовательский ввод всегда является строкой. Затем вам нужно более точно определить свою цель. Например, разумная вещь, чтобы отличить, состоит в том, может ли вход обрабатываться целиком как целое число, или как число с плавающей запятой, или нет. Здесь один из способов сделать это с помощью iostreams, не считая пробелов:
#include <iostream>
#include <sstream>
#include <string>
for (std::string line; std::getline(std::cin, line); )
{
std::istringstream iss1(line), iss2(line);
int n;
double x;
if (iss1 >> n >> std::ws && iss1.get() == EOF)
{
// have an int, use "n"
}
else if (iss2 >> d >> std::ws && iss2.get() == EOF)
{
// have a floating point number, use "d"
}
else
{
// failed to parse the input
continue;
}
}
Вы хотите использовать что-то вроде
if (std::cin >> den) {
// process den
}
else {
// deal with invalid input
}
Когда операция ввода завершается неудачно, он устанавливает std::ios_base::failbit
в потоке, и поток преобразуется в false
вместо true
. Хотя поток находится в этом режиме отказа, он ничего не будет читать из потока, т.е. Режим отказа, который будет очищен, например, используя
std::cin.clear();
Как только режим отказа очищается, в потоке все еще сидит оскорбительный символ. Вы можете игнорировать следующий символ, например,
std::cin.ignore();
или игнорировать все символы до следующей новой строки:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');