Проверка входных данных int C ++

0

Я в основном хочу проверить, что у меня есть 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(), потому что я не хочу использовать строку, если она не нужна.

  • 0
    Проверьте результат операции ввода.
  • 0
    ну Cin автоматически преобразует его в INT я думал? Я думаю, что я должен был включить мои предыдущие две строки.
Показать ещё 5 комментариев
Теги:
input

3 ответа

1

Если вы хотите, чтобы ваш ввод имел целочисленный тип, используйте для этого ввод целого типа. Если 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;
  • 0
    Что если я хочу, чтобы вводилось целое число, а не число с плавающей точкой, преобразованное в int? Я вижу, как это даст мне целое число, но я не уверен, как сделать цикл, пока пользователь не даст мне целое число. Будет ли это как-то связано с буфером = ''?
  • 0
    Это не даст вам «float, преобразованный в int». Это будет только читать в Int. Если вы хотите прочитать всю строку и преобразовать ее, вам нужно использовать std::getline с std::string а затем преобразовать числа ... но это не нужно.
Показать ещё 2 комментария
0

Прежде всего, пользовательский ввод всегда является строкой. Затем вам нужно более точно определить свою цель. Например, разумная вещь, чтобы отличить, состоит в том, может ли вход обрабатываться целиком как целое число, или как число с плавающей запятой, или нет. Здесь один из способов сделать это с помощью 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;
    }
}
0

Вы хотите использовать что-то вроде

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');

Ещё вопросы

Сообщество Overcoder
Наверх
Меню