gpt4 book ai didi

c - 良好的 C 编码实践/完整性检查礼仪

转载 作者:行者123 更新时间:2023-12-01 13:46:41 25 4
gpt4 key购买 nike

两部分问题;

我来自高级语言,所以这是一个关于形式而不是功能的问题;

我编写了一个 isnumeric() 函数,它接受一个 char[] 并在字符串是利用 ctype 中的 isdigit() 函数的数字时返回 1。其他语言内置了类似的功能,我一直使用类似的功能在将数据转换为数字类型之前对其进行完整性检查。主要是因为如果您尝试将非数字字符串转换为整数,某些语言转换函数会严重失败。

但似乎不得不做所有循环来弥补 C 中缺少字符串,这是问题的第一部分。

在 C 中捕获 atoi() 返回 0 来代替在调用 atoi() 之前对数据进行完整性检查是否可以接受? atoi()(和其他 ascii 到 xx 函数)的工作方式似乎很适合完全消除完整性检查。跳过检查肯定会更有效。

问题的第二部分是;
是否有用于数字完整性检查的 C 函数或公共(public)库函数
在一个字符串上? (通过字符串,我当然是指 char[])

最佳答案

Is it acceptable practice in C to trap for a 0 return from atoi() in lieu of doing an integrity check on the data before calling atoi()?



永远不要陷入错误,除非错误表明如果代码中没有错误就不会发生编程错误。在发生错误时总是返回某种错误结果。看看 OpenBSD strtonum 关于如何设计这样一个界面的函数。

The second part of the question is; Is there a C function or common library function for a numeric integrity check on a string? (by string, I of course mean char[])



切勿使用 atoi除非你正在编写一个没有错误检查的程序,如 atoi不做任何错误检查。 strtol 函数系列允许您检查错误。以下是如何使用它们的简单示例:
int check_is_number(const char *buf)
{
const char *endptr;
int errsave = errno, errval;
long result;

errno = 0;
result = strtol(buf, &endptr, 0);
errval = errno;
errno = errsave;

if (errval != 0)
return 0; /* an error occured */

if (buf[0] == '\0' || *endptr != '\0')
return 0; /* not a number */

return 1;
}

有关 strtol 的第三个参数的方法,请参见之前链接的手册页。 (base) 影响它的作用。
errno设置为 ERANGE如果该值超出了所需类型的范围(即 long )。在这种情况下,返回值为 LONG_MAXLONG_MIN .

关于c - 良好的 C 编码实践/完整性检查礼仪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35523358/

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