C ++ - 验证正确的输入类型

时间:2010-02-28 03:05:55

标签: c++ input

我有以下代码:

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

它有效,但只有我输入2个数字。如果我要输入一个字母,比如'n',那么程序就会陷入无限循环。如何检查以确保用户输入了数字并避免无限循环?

2 个答案:

答案 0 :(得分:4)

一旦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轻松地将字符串转换为数字。

答案 1 :(得分:0)

输入两个字符串并使用ctype.h中的函数来检查输入的有效性。