C ++确保用户输入值仅为int

时间:2014-11-06 00:24:24

标签: c++11 floating-point double user-input

我对C ++有点新意,非常感谢任何意见或建议!因此,通过我们的介绍课程项目,我一直在寻找一种方法来确保在编程时。正在询问它正确响应的int值!也就是说,在输入double和string的情况下它都表示无效!所以如果cin>> intVariable ... intVariable不接受cn条目" abdf"或20.01。

为了达到这个目的,我编写了以下功能......它有效,但我正在寻找关于如何进一步改进这个过程的想法!

void getIntegerOnly(int& intVariable, string coutStatement)
{
    bool isInteger; // Check if value entered by user is int form or not
    string tmpValue; // Variable to store temp value enetered by user

    cout << coutStatement; // Output the msg for the cin statement 

    do
    {
        cin >> tmpValue; // Ask user to input their value

        try // Use try to catch any exception caused by what user enetered
        {
            /* Ex. if user enters 20.01 then the if statement converts the 
            string to a form of int anf float to compare. that is int value
            will be 20 and float will be 20.01. And if values do not match 
            then user input is not integer else it is. Keep looping untill 
            user enters a proper int value. Exception is 20 = 20.00      */
            if (stoi(tmpValue) != stof(tmpValue))  
            {
                isInteger = false; // Set to false!
                clear_response(); // Clear response to state invalid
            }
            else
            {
                isInteger = true; //Set to true!
                clear_cin(); // Clear cin to ignore all text and space in cin!
            }
        }
        catch (...) // If the exception is trigured!
        {
            isInteger = false; // Set to false!
            clear_response(); // Clear response to state invalid
        }

    } while (!isInteger); //Request user to input untill int clause met

    //Store the int value to the variable passed by reference
    intVariable = stoi(tmpValue); 
}

这只是在运行基于Win32控制台的应用程序时让用户年龄和年龄大于零的示例!感谢您的反馈:)

3 个答案:

答案 0 :(得分:1)

一种方式如下:

std::string str;
std::cin >> str;
bool are_digits = std::all_of(
  str.begin(), str.end(), 
  [](char c) { return isdigit(static_cast<unsigned char>(c)); }
);

return are_digits ? std::stoi(str) : throw std::invalid_argument{"Invalid input"};

并捕获调用方的异常(stoi也可以抛出std::out_of_range)。

答案 1 :(得分:0)

您可以利用stoi()的第二个参数。

string tmpValue;
size_t readChars;
stoi(tmpValue, &readChars);
if(readChars == tmpValue.length())
{
   // input was integer
}

编辑:这对包含“。”的字符串不起作用。 (例如用科学记法表示的整数)。

答案 2 :(得分:-2)

这不是我的工作,但这个问题的答案就是你想要的。将字符串作为参考传递给它。如果你的字符串是一个整数,它将返回true。

How do I check if a C++ string is an int?