在我当前的项目中,我根据 C11 标准(使用 构建gcc -std=c11)进行编码,并且需要类似的东西strnlen(“安全”版本strlen返回以 0 结尾的字符串的长度,但只能达到给定的最大值)。所以我查了一下(例如https://en.cppreference.com/w/c/string/byte/strlen),似乎 C11 标准提到了这样一个函数,但名称为strnlen_s.
因此我选择了strnlen_s,但是当包含string.h. 另一方面,strnlen是定义的,所以我目前的解决方案是使用strnlen一个注释,即标准名称似乎是strnlen_s,但这不是由 GCC 定义的。
问题是:我认为这strnlen是最可移植的名称是否正确,或者我可以做些什么使代码最可移植/标准?
注:微软(https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strnlen-strnlen-s)实现与区分这两种功能是strnlen_s检查字符串指针NULL,并返回0在这种情况虽然strnlen没有这样的检查。
问题是:我假设 strnlen 是最可移植的名称是否正确,或者我可以做些什么使代码最便携/标准?
不,它根本不便携。它从来不是 C 的一部分。它包含在 POSIX 中,这没有多大意义。
我会想象这个函数在标准中不存在的原因,可能是因为当我们已经有了memchr(str, '\0', max);.
strnlen_s是 C11 附件 K 中可选的边界检查接口的一部分。这一整章结果是一个巨大的失败,几乎没有任何编译器实现它。Microsoft 有类似的命名函数,但它们有时不兼容。所以我会假设所有的_s功能都是完全不可移植的。
所以不要使用这些,使用memchr或strlen。
编辑
如果您出于某种原因必须strnlen自己实施,那么这就是我的建议:
#include <string.h>
size_t strnlength (const char* s, size_t n)
{
const char* found = memchr(s, '\0', n);
return found ? (size_t)(found-s) : n;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |