【发布时间】:2021-02-24 07:34:17
【问题描述】:
在我当前的项目中,我正在根据 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 没有这样的检查。
【问题讨论】:
-
2021年,UTF-8 is everywhere,所以你可以使用GNU libunistring或Glib
-
@BasileStarynkevitch 对于许多需要 UTF-aware 的应用程序来说,这是一个很好的观点。我知道 UTF,但我当前的应用程序不需要。顺便说一句,您指向“UTF-8 无处不在”的链接中缺少一个“y”。
-
是的,正确的网站是utf8everywhere.org