gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:41:14 24 4
gpt4 key购买 nike

我有一个函数,应该传递一个带有两个数字的字符串(作为正则表达式: /-?[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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com