断言函数导致程序崩溃

Assert function causes program to crash

本文关键字:程序 崩溃 函数 断言      更新时间:2023-10-16

我使用了assert函数来确保第一个数字输入在1和7之间(包括1和7)。但是,当我执行程序并输入一个无效的数字时,它会导致程序崩溃。那么,如果是这样的话,断言函数在这里有什么用处呢?

请根据需要更正我的实施。

代码:

#include <iostream>
#include <assert.h>
using namespace std;
int main() {
    int num;
    int n;
    int max;
    cout << "Please enter a number between 1 & 7 n";
    cin >> num;
    assert(num >= 1 && num <= 7);
    for (int i = 0; i < num; i++) {
        cout << "Please enter number " << (i + 1) << ": ";
        cin >> n;
        if (i == 0) {
            max = n;
        }  
        max = (n > max) ? n : max;
    }
    cout << "The maxmum value is: " << max << endl;
    system("pause");
    return 0;
}

断言不是您想要的。您需要的是验证。断言用于调试,用于识别完全无效的程序状态。用户输入的无效输入是而不是无效程序状态,它只是无效用户输入

要执行验证,您需要if测试。您还需要一些准备好的代码来处理无效用户输入的情况。绝对没有办法阻止用户提供无效输入(除了疯狂的动态验证,即在键盘事件发生时捕捉键盘事件,并阻止这些击键转换为程序的字符输入,但现在我们变得越来越荒谬),所以当它发生时,你需要做出反应,比如,通过打印错误消息,然后要求更多的输入。

这样做的一种方法如下:

do {
    cin >> num;
    if (!(num >= 1 && num <= 7)) {
        cerr << "invalid number; must be between 1 and 7!" << endl;
        num = -1;
    }
} while (num == -1);

为了扩展关于断言的这一点,应该使程序崩溃。断言失败意味着您的代码已损坏,必须先进行修复,然后才能在现实生活中使用。断言失败永远不应该在生产代码中触发;它们只是帮助测试和捕捉bug。

"崩溃"的作用是什么?根据我的说法,assert将中止程序执行,可能是0以外的另一个值。