_memccpy 的宽字符版本
Wide-character version of _memccpy
我必须连接宽 C 风格的字符串,根据我的研究,似乎 _memccpy
is most ideal (in order to avoid Shlemiel's problem)。但我似乎找不到宽字符版本。有这样的东西吗?
Does something like that exist?
C 标准库不包含 Microsoft _memccpy()
的宽字符版本。它也不包含 _memccpy()
本身,尽管 POSIX 指定了 memccpy()
函数,MS 的 _memccpy()
似乎是在该函数上建模的。
POSIX 还定义了 wcpcpy()
(stpcpy()
的宽版本),它复制一个宽字符串和 return 指向结果末尾的指针。这不如 memccpy()
功能全面,但足以避免 Shlemiel 的问题,只要 Microsoft 的 C 库提供它的一个版本即可。
但是,您可以使用 swprintf()
连接宽字符串而不会遇到 Shlemiel 问题,还有一个额外的好处,即它 是 在标准库中,因为 C99 .它不提供 memccpy
在复制用户指定的(宽)字符后停止的行为,但它提供 return 写入的宽字符数,相当于 returning a指向结果结尾的指针。此外,它可以在一次调用中直接连接任意固定数量的字符串。 swprintf
确实有很大的开销。
当然,如果 swprintf
的开销让您望而却步,那么编写您自己的代码也很容易。结果可能不如您的库供应商精心调整的实现那么高效,但我们讨论的是扩展问题,因此您主要需要在渐近复杂性方面取胜。简单例子:
/*
* Copies at most 'count' wide characters from 'src' to 'dest', stopping after
* copying a wide character with value 0 if that happens first. If no 0 is
* encountered in the first 'count' wide characters of 'src' then the result
* will be unterminated.
* Returns 'dest' + n, where n is the number of non-zero wide characters copied to 'dest'.
*/
wchar_t *wcpncpy(wchar_t *dest, const wchar_t *src, size_t count) {
for (wchar_t *bound = dest + count; dest < bound; ) {
if ((*dest++ = *src++) == 0) return dest - 1;
}
return dest;
}
我必须连接宽 C 风格的字符串,根据我的研究,似乎 _memccpy
is most ideal (in order to avoid Shlemiel's problem)。但我似乎找不到宽字符版本。有这样的东西吗?
Does something like that exist?
C 标准库不包含 Microsoft _memccpy()
的宽字符版本。它也不包含 _memccpy()
本身,尽管 POSIX 指定了 memccpy()
函数,MS 的 _memccpy()
似乎是在该函数上建模的。
POSIX 还定义了 wcpcpy()
(stpcpy()
的宽版本),它复制一个宽字符串和 return 指向结果末尾的指针。这不如 memccpy()
功能全面,但足以避免 Shlemiel 的问题,只要 Microsoft 的 C 库提供它的一个版本即可。
但是,您可以使用 swprintf()
连接宽字符串而不会遇到 Shlemiel 问题,还有一个额外的好处,即它 是 在标准库中,因为 C99 .它不提供 memccpy
在复制用户指定的(宽)字符后停止的行为,但它提供 return 写入的宽字符数,相当于 returning a指向结果结尾的指针。此外,它可以在一次调用中直接连接任意固定数量的字符串。 swprintf
确实有很大的开销。
当然,如果 swprintf
的开销让您望而却步,那么编写您自己的代码也很容易。结果可能不如您的库供应商精心调整的实现那么高效,但我们讨论的是扩展问题,因此您主要需要在渐近复杂性方面取胜。简单例子:
/*
* Copies at most 'count' wide characters from 'src' to 'dest', stopping after
* copying a wide character with value 0 if that happens first. If no 0 is
* encountered in the first 'count' wide characters of 'src' then the result
* will be unterminated.
* Returns 'dest' + n, where n is the number of non-zero wide characters copied to 'dest'.
*/
wchar_t *wcpncpy(wchar_t *dest, const wchar_t *src, size_t count) {
for (wchar_t *bound = dest + count; dest < bound; ) {
if ((*dest++ = *src++) == 0) return dest - 1;
}
return dest;
}