我有一个函数,应该传递一个带有两个数字的字符串(作为正则表达式: /-?[0-9]+ -?[0-9]+/
)并返回第二个。
我决定程序应该做错误检查。首先,它应该测试字符串是否实际上是所需的形式;其次,它应该确保第一个数字(未返回的数字)是连续的。
现在我已经编程了很长时间,这不是一项艰巨的任务。 (由于数字不需要适合机器字这一事实使这变得稍微困难一些。)但我的问题是我应该如何做到这一点,而不是我如何做到。我提出的所有解决方案都有些难看。
NULL
就将值留在那里);这似乎是错误的事情。 因此,任何有关在 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/