验证无字符和负输入的输入

时间:2019-04-02 12:17:31

标签: c++

我正在模拟一个计算器,想知道我该如何只接受正输入而没有其他字符(负整数,字母等)

我尝试使用2个do while循环,一个验证正整数和另一个验证字符,但似乎无法为1个输入进行2个循环,否则,看起来会很奇怪...

do{

 if (invalid == true)
 {
    cout << "Invalid input, please enter a positive number" << endl;
 }
 cout << "Please enter the first number:" << endl;
 cin >> num1;
 cin.ignore();
 invalid = true;
 } while (num1 < 0);
 invalid = false;

使用上面的代码,它仅将输入验证为正整数,但是一旦我输入了字母(如字母),程序就会崩溃。有什么办法可以同时排除两者?

2 个答案:

答案 0 :(得分:1)

我的建议是将整行读取为字符串(使用std::getline),然后尝试将字符串解析为无符号整数。

可以实现类似

unsigned value;

for (;;)
{
    std::string input;
    if (!std::getline(std::cin, input))
    {
        // Error reading input, possibly end-of-file
        // This is usually considered a fatal error
        exit(EXIT_FAILURE);
    }

    // Now parse the string into an unsigned integer
    if (std::istringstream(input) >> value)
    {
        // All went okay, we now have an unsigned integer in the variable value
        break;  // Break out of the loop
    }

    // Could not parse the input
    // TODO: Print error message and ask for input again

    // Loop continues, reading input again...
}

可以将其放入函数中进行泛化,因此可以将其重用于获取多个值。您甚至可以将函数设为模板,以便可以将其用于不同的输入类型(有符号或无符号整数,浮点数,甚至具有合适的输入运算符>>重载的对象)。

答案 1 :(得分:0)

检查std::cin >>的结果,并在发生错误时清除错误,然后读一个单词(如果愿意,还可以阅读所有行),不要忘记处理EOF情况。

例如

#include <iostream>
#include <string>

int main()
{
  int n;

  for (;;) {
    if (!(std::cin >> n)) {      
      // remove bad 'word'
      std::cin.clear();
      std::string s;

      if (!(std::cin >> s)) {
        std::cerr << "EOF" << std::endl;
        return -1;
      }
      std::cerr << "not a number" << std::endl;
    }
    else if (n < 0)
      std::cerr << "negative value" << std::endl;
    else
      break;
  }

  std::cout << "positive value " << n << std::endl;

  return 0;
}

编译和执行:

pi@raspberrypi:~ $ g++ -pedantic -Wall -Wextra i.cc
pi@raspberrypi:~ $ ./a.out
aze
not a number
-1
negative value
2
positive value 2
pi@raspberrypi:~ $ 
pi@raspberrypi:~ $ echo | ./a.out
EOF
pi@raspberrypi:~ $ ./a.out
aze -1 23
not a number
negative value
positive value 23