_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;
}