Проверка ввода с использованием объекта cin и также очистка буфера (c )

#c #buffer #inputstream #cout #cin

#c #буфер #входной поток #cout #cin

Вопрос:

Ранее я программист на C (хочу узнать больше о системном программировании, но не хочу переходить к сборке, поэтому я выбираю C), но позже в моем университете я должен взять C , мне действительно трудно использовать объект cin and cout , поскольку он имеет некоторые изменения по сравнению с моим доверенным макросом printf() , scanf() getchar() в C. Вот код.

Код

  int main(void)
 {
    using namespace std;

    cout << "What is the number?nn";
    cout << "#Number :";
    cin >> num;

    while(cin.fail())
    {
        cin.clear();
        cin.ignore(1000 , 'n');
        cout << "Please enter a numbernn";
        cout << "#Number :";
        cin >> num;
    }

    return 0;
 }
  

Вопрос

1.) Я хочу, чтобы этот код запрашивал у пользователя число (меньше и больше или равное 0), когда пользователь вводит символ или строку, я хочу, чтобы он предупреждал пользователя об этом, очищал буфер ввода и повторно запрашивал у пользователя новое значение, пока оно не станет числом.

2.) Итак, я просто гуглю и нахожу страницу, проповедующую метод, поэтому я просто следую пути, но это не удалось. Я понятия не имею, почему, как только я запускаю этот код, введите символ, который приведет к бесконечному циклу вывода Please enter a number .Любая ошибка, допущенная мной в этом коде??

Спасибо, что потратили время на чтение моей проблемы

P / S: Я использую CodeBlocks с компилятором MinGW.

Ответ №1:

Вы не говорите, как произошел сбой, поэтому трудно сказать, в чем ваша проблема. Тот факт, что вы никогда не объявляете num , является одной из очевидных проблем. И это приведет к сбою, если вы также введете строку длиной более 1000 символов.

Более идиоматичным решением в C было бы читать ввод построчно, используя std::getline , а затем с помощью std::istringstream преобразовать строку в число.

Комментарии:

1. Хорошо, спасибо, в любом случае, в исходном коде я объявляю это 🙂 просто здесь я забыл добавить в строку

Ответ №2:

Стандартный способ использования форматирования ввода — внутри условной проверки самой операции. Кроме того, вы захотите прочитать всю строку и попытаться проанализировать ее, а не извлекать токен за токеном. Например. вот так:

 int num;

for (bool success = false; !success; )
{
  std::cout << "Please enter a number: ";

  std::string line;
  if (std::cin >> line)
  {
    std::istringstream iss(line);
    if (iss >> num) success = true;
  }

  if (!success) { std::cout << "Error!n"; }
}

std::cout << "Thank you. You said: " << num << std::endl;
  

Не стесняйтесь добавлять дополнительные диагностические данные в ветку ошибок.