C++ 如何处理这种副作用?

C++ 如何处理这种副作用?,c++,iostream,cin,C++,Iostream,Cin,如何更改代码,以使+32423与cin不正确?您需要准确确定您需要用户输入的内容以及使其有效的原因。在我看来,您似乎希望接受来自用户的整行输入(因此您应该将std::getline与std::string)一起使用),然后您只希望接受正好是“+”和“-”的字符串 正如@H2C03所提到的,将输入和解析分开是一个好主意。在这种情况下,解析非常简单,只需将输入行与字符串“+”和“-”进行比较,不要试图在一个步骤中做两件事。这是一个常见的错误--不要感觉太糟糕,scanf()函数族和std::istr

如何更改代码,以使
+32423
cin
不正确?

您需要准确确定您需要用户输入的内容以及使其有效的原因。在我看来,您似乎希望接受来自用户的整行输入(因此您应该将
std::getline
std::string
)一起使用),然后您只希望接受正好是
“+”
“-”
的字符串


正如@H2C03所提到的,将输入和解析分开是一个好主意。在这种情况下,解析非常简单,只需将输入行与字符串
“+”
“-”

进行比较,不要试图在一个步骤中做两件事。这是一个常见的错误--不要感觉太糟糕,
scanf()
函数族和
std::istream::operator>
的设计者犯了完全相同的错误

您试图做的是:获取用户输入并解析它以执行计算

你实际上在做什么:你在一个步骤中做了这些与生俱来的不同的事情,这让你感到困惑。您应该将这两个步骤清晰地分开:首先,获取用户输入,然后正确地解析它。例如:

std::string sign;
std::getline(std::cin, sign); // Gather input
if (sign != "+" && sign != "-") { // Parse input
  // ...
}
// ...
//获取整行
std::字符串行;
std::getline(std::cin,line);
//解析它:只有格式
//是可以接受的,最有可能的是中间有空格
std::string::iterator it=line.begin();
while(isspace(*it)&&it!=line.end()
it++;
std::string::iterator it2=it;
while(isdigit(*it)和&it!=line.end()
it++;
std::字符串第一个_编号(it2,it);//为第一个数字构造一个新的子字符串
//等。以类似的方式继续解析

使用
字符串
获取输入。检查
string==+/-
。我在这里没有看到任何副作用。所以我应该用string代替char,用getline代替cin?@Joshua不,你需要用
cin
来获取你的输入。请参阅我的编辑。@JosephMansfield否,他确实应该使用
getline()
,以获得一行输入。我很确定他们只希望能够接受单个
+
或单个
-
,所以解析就像比较输入行和这两个单字符串一样简单。@JosephMansfield那么你是说
12345+12345
也不正确吗?我认为根本不是这样——OP非常清楚,非常明显地想要执行一些算术。但即便如此,为什么还要麻烦呢?我关于“分两步做”的建议仍然适用,而且更容易实现。是的,我认为这也是不正确的。他们只需要接线员。他们接下来会得到操作数。
cin >> number;
std::string sign;
std::getline(std::cin, sign); // Gather input
if (sign != "+" && sign != "-") { // Parse input
  // ...
}
// ...
// get an entire line
std::string line;
std::getline(std::cin, line);

// parse it: only the format <some digits> <'+' or '-'> <other digits>
// is acceptable, most probably with interspersed whitespace
std::string::iterator it = line.begin();
while (isspace(*it) && it != line.end())
    it++;

std::string::iterator it2 = it;
while (isdigit(*it) && it != line.end())
    it++;

std::string first_number(it2, it); // construct a new substring for the 1st number

// etc. continue the parsing in a similar manner