检查空sstream

时间:2017-11-07 00:10:53

标签: c++

我写了一个函数,它可以替换cin整数并可能加倍,包括错误检查功能。使用cin.fail()我能够检查大多数情况,但这并没有涵盖输入后跟一个没有空格的字符串的情况。例如," 23三十三。"以下代码适用于此。

int getUserInt(string prompt = "Enter an integer: ", string errorMessage "Error: Invalid Input") {
    const int IGNORE_MAX = 100;
    int userInt = 0;

    bool isContinue = true;
    do {
        // initialize and reset variables
        string inputStr;
        istringstream inputCheck;
        userInt = 0;

        // get input
        cout << prompt;
        cin >> inputStr;
        inputCheck.str(inputStr);

        // check for valid input
        inputCheck >> userInt;
        if (!inputCheck.fail()) {
            // check for remaining characters
            if (inputCheck.eof()) {    // Edit: This is the section that I tried replacing with different code (made code compilable in response to comment)
                isContinue = false;
            }
            else {
                cout << errorMessage << endl;
            }
        }
        else {
            // reset cin and print error message
            cin.ignore(IGNORE_MAX, '\n');
            cin.clear();
            cout << errorMessage << endl;
        }
    } while (isContinue);

    return userInt;
}

这段代码有效,但我将其发布到Stack Overflow而非Code Review的原因是因为我的主要问题是为什么有些代码没有像我预期的那样工作。以下是我在前面的代码中尝试代替inputCheck.eof()的内容。我的问题是以下代码之间有什么区别?为什么没有方法2)和3)工作?哪种方法更受欢迎?

  1. inputCheck.eof()
  2. inputCheck.peek() == EOF
  3. inputCheck.str().empty()
  4. inputCheck.rdbuf()->in_avail() == 0
  5. 1)和4)按预期工作,但2)和3)没有。

    修改 我认为3)没有按预期工作,因为inputCheck.str()会在调用inputStr时返回inputCheck.str(inputStr)中包含的内容。但是,我不知道为什么inputCheck.peek() == EOF无效。

    如果这是相关信息,我正在通过bash g ++编译并运行Windows。

1 个答案:

答案 0 :(得分:0)

对于您提供的每个提示,您都可以希望用户按Enter键。获取输入为字符串,然后尝试转换。 (不要尝试从var message = MultiPattern.Format("one;There is {0} item remaining;other;There are {0} items remaining", count); 转换。)

奖励:这是执行转换的功能。

cin

你需要C ++ 20,或者需要template <typename T> std::optional <T> string_to( const std::string& s ) { std::istringstream ss( s ); T result; ss >> result >> std::ws; if (ss.eof()) return result; return {}; }

现在:

#include <boost/optional.hpp>

不再担心清除或重置std::cout << "Enter an integer! "; std::string s; getline( std::cin, s ); auto x = string_to <int> ( s ); if (!x) { std::cout << "That was _not_ an integer.\n"; } else { std::cout << "Good job. You entered the integer " << *x << ".\n"; } 。轻松执行一些循环(例如允许用户在退出前三次尝试)。等等。