C++ 无限循环导致堆栈溢出错误?

标签 c++ function stack-overflow infinite-loop

好的,所以我一直在研究我的计算器。我目前正试图让它分辨有效整数和字符之间的区别。作为一个简单的解决方法,我做了:

int calc()
{
cout << "Number 1:"; cin >> fnum;
cout << "Number 2:"; cin >> snum;
    if (snum <= -1000 || fnum <= -1000)
    {
        cout << ("Error: Invalid Number!") << endl;
        calc();
    }
    else
    {
        ff();
    }
return 0;
}

每当我输入一个字符时,它就会进入一个无限循环: SymbolHere:Number 1:Number 2:

ff();正在调用计算函数。

我想知道如何解决这个问题并防止堆栈溢出/无限循环?粘贴链接:http://pastebin.com/GxN2uJAQ

最佳答案

编辑:好的,这段代码有很多东西。

wait = 0;
while (wait <= 5)
{
   wait++;
}

绝对不会做任何事情,你的程序会增长得如此之快,以至于人类的大脑无法察觉。我建议完全删除它。

if (snum >= 0 || fnum >= 0)
                {
    cout << ("Error: Invalid Number!") << endl;
    wait = 0;
    while (wait <= 5)
    {
       wait++;
    }
    system("CLS");
    calc();
    }

如果这些数字有效,为什么要发送错误消息?除非您只添加负数,否则这应该有不同的范围。

你的函数调用也永远不会解析回 main,而是它们相互调用(ffcalc)无穷大,该程序确实有太多缺陷和糟糕的编程实践。放下你拥有的任何教程/书籍,并尝试找到更新的列表(对不起,我很苛刻,但不得不说)。

C++ Primer Plus

CPlusPlus.com

TheNewBoston (推荐)


你可能有一个输入失败,比如输入一个 char 代替一个 int,你需要确保捕获 cin 抛出的任何东西并清除状态:

std::string err = "error!";
try {
    std::cin >> x;
    if(!cin)
        throw err;
    //....
}
catch(std::string& ee)
{
    std::cout << ee << std::endl;
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
}

确保包含 <limits>在你的文件中。

关于C++ 无限循环导致堆栈溢出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16661334/

相关文章:

c# - 这个尾部递归是否会导致堆栈溢出? C# .Net

c# - 如何在不考虑平台的情况下在 C# 应用程序中使用 C++ 类?

c++ - 无法使用 CMake 找到 Eigen3

java - 递归函数中堆栈溢出错误的可预测性

c - 当输入无效时如何递归要求输入?

javascript - 当使用来自另一个函数的参数单击按钮时,我想将用户重定向到网页?

c - 在 GCC 中禁用堆栈保护不起作用

c++ - 在 for_each 中使用变换 boost fusion

c++ - nohup 和 std::ignore() 不能一起工作

c++ - 如何将方法存储为 map 容器中的函数指针?