2

在 C++ 程序中,我试图处理由整数操作数和运算符 (+ - / *) 组成的用户输入。我可以要求用户在每个运算符之前和之后放置空格。我的方法是假设任何不是 int 的东西都是运算符。因此,一旦流中出现非 eof 错误,我就会调用 cin.clear() 并将下一个值读入字符串。

#include <iostream>
#include <string>

//in some other .cpp i have these functions defined
void process_operand(int);
void process_operator(string);

using namespace std;

int main()
{
    int oprnd;
    string oprtr;
    for (;; )
    {
        while ( cin >> oprnd)
            process_operand(oprnd);
        if (cin.eof())
            break; 
        cin.clear();
        cin >> oprtr;
        process_operator(oprtr);
    }
}

这适用于 / 和 * 运算符,但不适用于 + - 运算符。原因是 operator>>在报告错误之前吃掉 + 或 - 并且不会将其放回流中。所以我得到一个无效的令牌读入 optrr。

Ex: 5 1 * 2 4 6 * /   works fine
    5 1 + 2 
          ^ ---> 2 becomes the oprnd here.

处理这个问题的好 C++ 方法是什么?

4

2 回答 2

5

读入std::strings 并使用boost::lexical_cast<>或等价物转换它们。

int main()
{
    string token;
    while ( cin >> token) {
        try {
            process_operand(boost::lexical_cast<int>(token));
        } catch (std::bad_cast& e) {
            process_operator(token);
        }
    }
}

后记:如果你对 Boost 过敏,可以使用 lexical_cast 的这个实现:

template <class T, class U>
T lexical_cast(const U& u) {
  T t;
  std::stringstream s;
  s << u;
  s >> t;
  if( !s )
    throw std::bad_cast();
  if( s.get() != std::stringstream::traits_type::eof() )
    throw std::bad_cast();
  return t;
}
于 2012-05-14T15:52:37.270 回答
3

我认为 >> 认为您正在使用 +/- 开始另一个整数。然后当你不跟随数字时会生气。

正如@Robᵩ所说,阅读一个字符串并进行转换。我只会从标准库中提供另一种选择:

int stoi(const string& str, size_t *idx = 0, int base = 10);

invalid_argument如果无法执行转换或out_of_range转换后的值超出返回类型的可表示值范围,则会引发此错误。

这是从标准。

于 2012-05-14T16:48:16.500 回答