cin >> i 输入错误,带有符号 +。
cin >> i 输入错误,带有符号 +。
在我的C++程序中,我试图处理用户输入,其中包含整数操作数和运算符(+ - / *)。我有幸要求用户在每个运算符之前和之后放置空格。我的方法是假设任何不是整数的东西都是运算符。所以一旦流上有非eof错误,我就调用cin.clear()并将下一个值读入字符串中。
#include
#include
//在另一个.cpp文件中,我定义了以下函数
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>>在报告错误之前吞掉了+或-,并且不将其放回到流中。所以我得到了一个无效的令牌读入oprtr中。
例如:5 1 * 2 4 6 * /工作正常
5 1 + 2
^ ---> 这里2成为oprnd。
如何用良好的C++方法解决这个问题?
在这段内容中,提到了一个问题:在使用cin进行输入时,如果输入中出现了符号+,会导致错误。错误的原因是cin认为+后面应该跟着数字,当没有数字跟随时,就会报错。为了解决这个问题,可以使用string类型的变量来接收输入,并将其转换为整型。可以使用标准库中的函数stoi来实现这个转换,该函数会抛出invalid_argument异常或out_of_range异常,具体取决于是否可以进行转换以及转换后的值是否超出了int类型的范围。使用stoi函数可以避免cin在输入中遇到+号时发生错误。这个建议可以在C++11中使用,可以参考en.cppreference.com/w/cpp/string/basic_string/stol了解更多信息。
在上述代码中,出现了(cin >> i error in input with symbol +)的错误。这个错误的原因是在输入时,输入了一个带有加号+的符号,导致无法正确读取输入。
解决这个问题的方法是,需要对输入进行错误处理。在代码中,使用了try-catch语句来捕获可能发生的错误。当使用boost::lexical_cast
另外,如果不想使用Boost库,还可以使用上述代码中提供的lexical_cast实现。这个实现使用了一个模板函数,接受一个参数u,并尝试将其转换为类型T。首先,将u写入一个stringstream对象s中,然后从s中读取到变量t中。如果转换失败或者在转换完成后s中还有剩余字符,就会抛出std::bad_cast异常。
因此,以上的代码提供了对输入错误进行处理的方法,能够解决(cin >> i error in input with symbol +)的问题。