在Mac OSX和Linux中是否有与Windows中的安全字符串函数(如strcpy_s,strncpy_s等)等效的函数?
那么用于多字节和宽字符之间转换的函数呢?
安全的字符串操作有两种策略。Linux / glibc 的维护者拒绝添加安全函数,认为您应该掌握字符串的长度并使用 memcpy
。
另一方面,Mac OSX 包含自 BSD 起源的 strlcpy
和 strlcat
。在这两个平台上,可以使用 snprintf
和 asprintf
来达到同样的效果:
size_t strlcpy(char *d, char const *s, size_t n)
{
return snprintf(d, n, "%s", s);
}
size_t strlcat(char *d, char const *s, size_t n)
{
return snprintf(d, n, "%s%s", d, s);
}
你也可以考虑使用BSD实现,在这里找到。如果你的代码将在多个平台上编译,你可以使用预定义库宏来测试glibc是否存在:
#if defined __GNU_LIBRARY__ || defined __GLIBC__
size_t strlcpy(char *, char const *, size_t);
size_t strlcat(char *, char const *, size_t);
#endif
使用iconv
接口最方便地处理字符编码之间的转换。
strlcpy
和 strlcat
实现,用于我正在移植到 Linux 的工具,但是这些实现并没有按预期工作;当我使用这个实现时,会出现大量缺失输出。将它们替换为 BSD 实现(http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/string/)可以产生预期的结果。 - Roblibbsd
包即可。Debian包名为libbsd-dev
,Fedora包名为libbsd-devel
。 - jwwOSX有strlcpy
和strlcat
函数。据我所知,Linux目前没有这些函数,但是可以很容易地从OpenBSD等操作系统中引入这些函数。
您可以使用gcc的-D_FORTIFY_SOURCE=2
选项,对于Linux系统,您可以更加深入地了解此问题,具体内容请参考Secure Programming with gcc & glibc。
FORTIFY_SOURCE=2
才能按照您的期望工作。在许多情况下,它无法推断缓冲区的大小。如果GCC无法推断缓冲区的大小,则原始的不安全函数仍然存在。最好明确地使用“更安全”的字符串函数。 - jww有标准的C函数可以在多字节字符和宽字符之间进行转换:mbtowc()
、mbstowcs()
、wctomb()
、wcstombs()
等。
std::string
有一个处理C接口的接口:str.c_str()
将返回一个char const*
,您可以将其传递给C API。 - C. K. Younglibbsd
软件包。Debian软件包是libbsd-dev
,而Fedora软件包是libbsd-devel
。 - jww