gpt4 book ai didi

c++ - cin >> i 符号输入错误 +

转载 作者:搜寻专家 更新时间:2023-10-30 23:48:20 25 4
gpt4 key购买 nike

在 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>> 在报告错误之前吃掉了 + 或 - 并且没有将其放回流中。所以我将一个无效的 token 读入 oprtr。

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

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

最佳答案

读入std::string s 并使用 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;
}

关于c++ - cin >> i 符号输入错误 +,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10586720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com