限制控制台中输入的空格

时间:2014-03-11 01:56:12

标签: c++ if-statement input while-loop cin

我有3 cin for int。

int input1;
cin >> input;

int input2;
cin >> input2;

int input3
cin >> input3;

问题是如果我在控制台中键入2 3 4,它将一次性输入所有3个。我该如何防止这种情况?如果他们这样做,可能会给他们一个警告。基本上是错误输入验证。

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案:

int strict_stoi(const string& s)
{
    size_t end_pos;
    int num = stoi(s, &end_pos);
    for (size_t i=end_pos; i<s.length(); ++i)
    {
        if (!isspace(s[i]))
            throw invalid_argument("You have entered some garbage after the number!");
    }
    return num;
}

int read_number()
{
    string s;
    getline(cin, s);
    return strict_stoi(s);
}

int read_number_with_retry(const char* prompt)
{
    for (;;)
    {
        try
        {
            cout << prompt;
            return read_number();
        }
        catch (invalid_argument& ex)
        {
            cout << ex.what() << endl;
        }
    }
}

int test()
{
    int input1 = read_number_with_retry("Enter input #1: ");
    int input2 = read_number_with_retry("Enter input #2: ");
    int input3 = read_number_with_retry("Enter input #3: ");

    return 0;
}

如果你输入一个完全无效的参数(例如“a”),那么它会显示一个不太用户友好的“无效stoi参数”消息,但是如果你输入“5 6”那么它会显示“你输入了一些垃圾”号码之后!“如果你想用一些用户友好的东西替换“无效的stoi参数”消息,那么当你发现“数字后面的垃圾”时你应该抛出一个invalid_argument异常,你应该抛出你自己的garbage_after_the_number异常并在此你可以区分两个不同的错误:只有在输入无效的情况下才会抛出invalid_argument(如“a”),只有在出现其他类型的错误时才会抛出garbage_after_the_number你可以捕获两个不同的例外,你可以在这两种情况下打印完全自定义的消息。我将此实施作为额外的练习留给您。

答案 1 :(得分:0)

您可以这样做:

#include <iostream>
#include <sstream>

int main() {
    while(true) {
        std::cout << "Enter a number [Enter to quit]: ";
        std::string line;
        getline(std::cin, line);
        if(line.empty()) break;
        else {
            std::stringstream input(line);
            int number;
            // Preceding white space number trailing white space:
            input >> number >> std::ws;
            if(input && input.eof()) {
                std::cout
                    << "The number surronded by possible white space is: "
                    << number
                    << '\n';
            }
            else {
                std::cout
                    << "The input line is invalid: "
                    << line
                    << '\n';
            }
        }
    }
}

如果你想严格要求:

#include <iostream>
#include <iomanip>
#include <sstream>

...

// Number without preceding and trailing white space:
input >> std::noskipws >> number;

...