【问题标题】:Why does this cause in infinite loop with chars but not doubles?为什么这会导致无限循环中的字符而不是双精度数?
【发布时间】:2016-11-11 06:10:31
【问题描述】:

我觉得我在做一些非常愚蠢的错误。我只是想让程序在用户输入非双精度时告诉用户,并继续循环回到您输入值的 cin。

我希望用户输入任何数字。然后必须做这个微不足道的数学并重复。它在这方面工作正常,当输入一些意外的输入(如字符)时,问题就出现了。然后输入以某种方式将其发送到一个循环中,在该循环中循环数学问题,而不是仅仅告诉用户他们必须输入一个数字并循环回 cin 输入一个新数字。

#include <iostream>
#include <cstdlib>

using std::cout; using std::cin; using std::endl;

long double domath(long double i)
{ 
     cout << i << "/" << 2 << "=" << i/2 << endl;    
     cout << i/2 << "*" << 10 << "=" << (i/2)*10 << endl << endl;   
     cout << 5 << "*" << i << "=" << 5*i << "\n\n";      
     return 0;
}

int main()
{

    long double in = 0;

    while(true)
    {
        cin >> in;         
        if (cin.fail()) {             
            in = char(int(in));  
        }           
        domath(in);
    }
    system("pause>nul");
    return 0;
}

【问题讨论】:

标签: c++ loops


【解决方案1】:

你不能尝试做这样的事情吗?

int x;

if(std::cin >> x)
  doSomethingCool(x);
else
  std::cout << "Error, not a valid integer!" << std::endl;

在输入错误时退出循环。

我认为这比清除缓冲区和所有其他爵士乐感觉更自然/看起来更干净。只是我的看法。

if (cin >> x) - Why can you use that condition?

编辑:Bul 的回答仍然是一个不错的回答。

【讨论】:

    【解决方案2】:

    如果失败,您不会清除cin,它会无限尝试将错误的输入解析为双倍,每次都失败。出现错误需要清空缓冲区:

    if (cin.fail()) {
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        in = char(int(in));
    }
    

    另外,无法理解您要达到的目的

    in = char(int(in));
    

    in 是一个 long double 变量,将保存您分配给它的最后一个值,无需“转换”它来进行数学运算。

    【讨论】:

    • 为什么我不用输入数字来清除它?
    • @x4kepa 因为它在解析时成功使用它
    • 你在哪里学过这样的东西?什么时候做这样的事情的具体知识从何而来?
    • @x4kepa 反复试验,调试器和谷歌使用量很大
    • 谢谢,这对我很有帮助,我必须学习如何在 Dev 上使用调试器,或者学习如何不擅长编码......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2017-09-08
    • 2014-05-06
    相关资源
    最近更新 更多