c - 处理此错误检查的正确方法是什么?

标签 c error-handling validation

我有一个函数,应该传递一个带有两个数字的字符串(作为正则表达式: /-?[0-9]+ -?[0-9]+/ )并返回第二个。

我决定程序应该做错误检查。首先,它应该测试字符串是否实际上是所需的形式;其次,它应该确保第一个数字(未返回的数字)是连续的。

现在我已经编程了很长时间,这不是一项艰巨的任务。 (由于数字不需要适合机器字这一事实使这变得稍微困难​​一些。)但我的问题是我应该如何做到这一点,而不是我如何做到。我提出的所有解决方案都有些难看。

  • 我可以使用一个全局变量来保存值并比较它们(或者如果它是 NULL 就将值留在那里);这似乎是错误的事情。
  • 我可以通过引用传递返回值和最后/当前行的第一个数字中的一个或两个,并修改它们
  • 我可以使用返回值给出一个 bool 值,因为有/没有错误

  • 因此,任何有关在 C 中处理此类错误检查的正确方法的想法都将受到欢迎。

    这与更理论化的 question I asked on cstheory 有关.作为引用,这里是函数:
    char*
    scanInput(char* line)
    {
        int start = 0;
        while (line[start] == ' ' || line[start] == '\t')
            start++;
        if (line[start] == '#')
            return NULL;    // Comment
        if (line[start] == '-')
            start++;
        while (line[start] >= '0' && line[start] <= '9')
            start++;
        while (line[start] == ' ' || line[start] == '\t')
            start++;
        int end = start;
        if (line[end] == '-')
            end++;
        while (line[end] >= '0' && line[end] <= '9')
            end++;
        if (start == end)
            return NULL;    // Blank line, or no numbers found
        line[end] = '\0';
    
        return line + start;
    }
    

    它是这样调用的:
    while(fgets(line, MAX_LINELEN, f) != NULL) {
        if (strlen(line) > MAX_LINELEN - 5)
            throw_error(talker, "Maximum line length exceeded; file probably not valid");
        char* kept = scanInput(line);
        if (kept == NULL)
            continue;
        BIGNUM value = strtobignum(kept);
        if (++i > MAX_VECLEN) {
            warning("only %d terms used; file has unread terms", MAX_VECLEN);
            break;
        }
        // values are used here
    }
    

    最佳答案

    最终,您将需要隔离和转换每一行中的两个大数字。要检查该行上的第一个数字是否是前一个数字之后的数字,您必须保留最后找到的此类数字的记录。因此,您可能需要一个结构,例如:

    BIGNUM old_value = 0;  // See notes below
    
    while (fgets(line, sizeof(line), f) != 0)
    {
        BIGNUM value1;
        BIGNUM value2;
        if (ScanDoubleBigNum(line, &value1, &value2) != 0)
            ...handle line format error...
        if (old_value == 0 || are_consecutive(old_value, value1))
        {
            // OK - valid information found
            // Release old_value
            old_value = value1;
            process(value2);
            // Release value2
        }
        else
            ...handle non-consecutive error...
    }
    
    are_consecutive()函数确定它的第二个参数是否大于它的第一个参数。 process()函数执行您需要对第二个值执行的任何操作。 ScanDoubleBigNum()功能与您的ScanInput()有关但它读取两个值。实际代码将调用另一个包含 ScanBigNum() 大约一半的函数(称之为 ScanInput())。 (因为它包含两次基本上相同的代码),加上当前在循环中发生的转换。 ScanDoubleBigNum()中的代码将调用 ScanBigNum()两次。请注意 ScanBigNum()将需要确定扫描完成的位置,以便第二个调用可以在第一个停止的地方继续。

    我冒昧地假设 BIGNUM是由指针标识的已分配结构,因此初始化BIGNUM old_value = 0;是一种表示尚无值(value)的方式。大概有一个函数可以释放BIGNUM .如果这是不正确的,那么您需要修改建议的代码以适应 BIGNUM 的实际行为。类型。 (这是基于 OpenSSL 还是 SSLeay 代码?)

    关于c - 处理此错误检查的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6645385/

    相关文章:

    java - 使用 Spring 表单验证错误

    php - 如何使用php制作涉及 session cookie的注销页面?

    c++ - CppUTest 单元测试框架多重定义异常

    c - Fwrite 无法正常工作

    c - 解读 qsort 行为

    FTP 挂起/421 超时的 Python 错误处理

    ruby-on-rails - Rails : undefined method `each' for nil:NilClass

    java - ActionError 消息未显示在 UI 中

    c - itoa 实现崩溃?

    java - 创建生态系统时出现处理错误