如何处理这种副作用?

时间:2014-01-19 09:58:49

标签: c++ iostream cin

char sign;
cout << "Enter '+' for addition or '-' for subtraction: ";
cin >> sign;
if ( sign != '+' && sign != '-' ) {
     cout << "you can only enter '+' or '-'!\n";
     return 1;
}

如果我输入+32423,则cin的输入仍然正确(它将通过检查),因为+将自动设置为签名变量,同时也32423 1}}将存储到我的下一个变量中,如果有:

cin >> number;

如何更改代码以使+32423的{​​{1}}不正确?

2 个答案:

答案 0 :(得分:2)

您需要准确确定用户需要输入的内容以及使其有效的内容。听起来我觉得你想要接受用户的整行输入(所以你应该std::getline使用std::string),然后你只想接受正好{{1}的字符串}和"+"

"-"

正如@ H2C03所提到的,分割输入和解析是个好主意。在这种情况下,解析就像将输入行与字符串std::string sign; std::getline(std::cin, sign); // Gather input if (sign != "+" && sign != "-") { // Parse input // ... } // ... "+"进行比较一样简单。

答案 1 :(得分:2)

不要试图一步完成两件事。这是一个常见的错误 - 感觉不是太糟糕,scanf()函数家族的设计者和std::istream::operator>>犯了同样的错误。

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

实际做什么:你只是一步完成这些不同的事情,这让你感到困惑。您应该清楚而干净地将两个步骤分开:首先,获取用户输入,并正确解析它。如:

// 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