【问题标题】:Checking input value is an integer type [duplicate]检查输入值是整数类型[重复]
【发布时间】:2016-05-27 09:30:50
【问题描述】:

我创建了检查输入值的 do-while 循环(如下)。这个循环的唯一值是1和2。当我放双值ex时。 1.2 或 4.5 它隐式转换为整数(1 和 4 值)。当我输入字符串值时,循环无限工作,我必须关闭控制台并从头开始调试。如何编写正确的循环来保护输入值免受双精度和字符串值的影响?

int triangle;
do{
        cout << "Put the number (1 or 2): ";
        cin >> triangle;
    } while (triangle > 2 || triangle < 1 || !cin);

【问题讨论】:

  • 循环条件应该是cin &amp;&amp; (triangle &lt; 1 || triangle &gt; 2)
  • this thread 中接受的答案是您正在寻找的。您可以对其进行调整以读取浮点数并检查小数部分。
  • fmod

标签: c++


【解决方案1】:
int check()
{
    string s;
    cin >> s;
    if(s.length() == 1)
    {
        if((s[0] == '1') || (s[0] == '2'))
        {
            return s[0] - '0';
        }
    }
    return 0;
}
int main()
{
    int triangle;
    do
    {
        cout << "Put the number (1 or 2): ";
    }
    while (triangle = check());
    return 0;
}

【讨论】:

    【解决方案2】:

    您可以通过以下方式检查它

    int triangle;
    cin >> triangle;
    
    if (cin.fail()) {
        //Not an int.
    }
    

    【讨论】:

    • 嗯,检查cin 错误为if (!(cin &gt;&gt; triangle)) {/* Not an int */} 会更好。
    • 在检测到输入错误后知道如何清理流也很高兴。
    • 如果输入浮点值,这两种技术都不起作用。由于 OP 提到了输入浮点值。
    • 如果我有时间我会更新它以合并上面的完整代码,向您展示它完全可以使用循环。
    【解决方案3】:

    1.最好初始化triangle

    2.当std::basic_istream::operator&gt;&gt;提取失败时,会设置failbit。您应该检查结果并调用std::basic_ios::clear 清除错误状态并调用std::basic_istream::ignore 跳过错误输入。

    int triangle = 0;
    
    for (;;) {
        cout << "Put the number (1 or 2): ";
        if (cin >> triangle) {
            if (triangle == 1 || triangle == 2) break;
        } else {
            cin.clear(); // reset stream state after failure
            cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input
        }
    }
    

    【讨论】:

    • 是的,这个解决方案是解决输入字符串值的问题,但双值问题仍然存在。特别是当我放前。 '1.2' 它是隐式转换为 '1' 并让它循环出去。
    • @kenzolek 对于int,输入过程(提取)将在字符.处结束,然后只读取1。我认为您需要将类型更改为string,然后检查它是intdouble 或其他。
    【解决方案4】:

    scanf("%d", &triangle) 如果读取一个整数则返回 1,否则返回 0。

    所以你可以这样做(它也照顾 EOF)

    printf("Enter option (1 or 2)\n");
    while(~scanf("%d", &n))
    {
         if (n!=1 && n!=2)
               break;
         printf("Enter option (1 or 2)\n");
    }
    

    【讨论】:

    • 不完全是现代 c++
    • ~scanf ... 真的
    猜你喜欢
    • 2013-11-16
    • 2014-11-29
    • 2011-05-03
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多