Проверка ввода с использованием объекта cin, а также очистка буфера (c ++) - PullRequest
0 голосов
/ 04 ноября 2011

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

Код

 int main(void)
 {
    using namespace std;

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

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

    return 0;
 }

Вопрос

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

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

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

0 голосов
/ 04 ноября 2011

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

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;

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

...