C ++ - Проверка правильности типа ввода - PullRequest
1 голос
/ 28 февраля 2010

У меня есть следующий фрагмент кода:

...
int x = 0;
int y = 0;
cin >> x >> y;
if (x == -1 && y == -1) {
    cout << "exit!";
}
else {
    doSomething();
}
...

И это работает, но только если я ввожу 2 числа. Если бы мне нужно было ввести букву, например, «n», программа была бы зациклена Как проверить, чтобы убедиться, что пользователь ввел число и избежать бесконечного цикла?

Ответы [ 2 ]

4 голосов
/ 28 февраля 2010

Как только cin видит несоответствие типов между входными данными и переменными, в которые вы пытаетесь прочитать, оно переходит в состояние "сбой". Конфликтующие переменные не будут обновлены. Обратите внимание:

2010-02-27 22:54:27 ~/tmp/ $ cat ju3.cpp
#include <iostream>
using namespace std;
int main() {
  int             x = 0;
  int             y = 12345;
  string          s, a;

  printf("cin good? %d, reading...\n", cin.good());
  cin >> a >> x >> y >> s;
  printf("a=%s, x=%d, y=%d, s=%s\n", a.c_str(), x, y, s.c_str());
  printf("... read, cin good? %d\n", cin.good());
  return 0;
}
2010-02-27 22:54:36 ~/tmp/ $ g++ ju3.cpp -o ju3
2010-02-27 22:54:56 ~/tmp/ $ echo 1 2 3 4 | ./ju3
cin good? 1, reading...
a=1, x=2, y=3, s=4
... read, cin good? 1
2010-02-27 22:55:05 ~/tmp/ $ echo a x y z | ./ju3
cin good? 1, reading...
a=a, x=0, y=12345, s=
... read, cin good? 0

Есть два способа избежать проблемы, с которой вы сталкиваетесь.

  • Быстрое решение состоит в том, чтобы просто проверить cin.good() вместо сравнения чисел с -1.
  • Если вы хотите, чтобы cin вел себя более надежно, прочитайте string с вместо int с и вручную убедитесь, что они содержат только числовые символы. Затем вы можете использовать stringstream для простого преобразования строк в числа.
0 голосов
/ 28 февраля 2010

введите две строки и используйте функции из ctype.h для проверки правильности ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...