gpt4 book ai didi

c - 哪个是最标准的 : strnlen or strnlen_s?

转载 作者:行者123 更新时间:2023-12-03 23:33:22 25 4
gpt4 key购买 nike

在我当前的项目中,我根据 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是最便携的名称还是我可以做些什么来使代码最便携/标准?
注意:Microsoft (https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strnlen-strnlen-s) 实现了这两个功能,区别在于 strnlen_s检查字符串指针是否为 NULL并返回 0在那种情况下,而 strnlen没有这样的检查。

最佳答案

The question is: am I correct to assume that strnlen is the most portable name to use or what could I do for the code to be most portable/standard?


不,它根本不便携。它从来不是 C 的一部分。它包含在 POSIX 中,这并不意味着什么。
我可以想象标准中不存在该功能的原因,可能是因为当我们已经有 memchr(str, '\0', max); 时它是多余的. strnlen_s是 C11 附件 K 中可选的边界检查接口(interface)的一部分。这一章是一场巨大的失败,几乎没有任何编译器实现它。 Microsoft 有类似的命名函数,但它们有时不兼容。所以我假设所有 _s功能是完全不可移植的。
所以不要使用这些,使用 memchrstrlen .

编辑
如果您必须执行 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;
}

关于c - 哪个是最标准的 : strnlen or strnlen_s?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66346502/

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