gcc arm 中的 strncpy 替换
strncpy replacement in gcc arm
strncpy()
在 arm 中没有适当的等价物,它将同时占用目标大小和要复制的源字符数,
strlcpy(char * /*dst*/, const char * /*src*/, size_t /*len*/);
所以这里我们必须只使用 strlcpy()
并希望源字符串以 null 结尾?
MS 提供了一个完美的(至少看起来是;)):
StringCchCopyN(LPTSTR pszDest, size_t cchDest, LPCTSTR pszSrc, size_t cchSrc);
对于外行来说,strncpy()
不安全(为什么 strncpy 不安全]1)。
你需要自己写
char *mystrncpy(char *dest, const char *src, size_t nbytes)
{
char *svd = dest;
if(nbytes)
{
dest[--nbytes] = 0;
while(*src && nbytes-- )
*dest++ = *src++;
}
return svd;
}
或
char *mystrncpy(char *dest, const char *src, size_t destsize, size_t srcsize)
{
memcpy(dest, src, destsize < srcsize ? destsize : srcsize);
dest[destsize -1] = 0;
return dest;
}
您可以使用 snprintf(dest, size, "%s", source);
请注意,对于 snprintf,source
确实需要 [=12=]
终止,即使长于 size
。
strncpy()
在 arm 中没有适当的等价物,它将同时占用目标大小和要复制的源字符数,
strlcpy(char * /*dst*/, const char * /*src*/, size_t /*len*/);
所以这里我们必须只使用 strlcpy()
并希望源字符串以 null 结尾?
MS 提供了一个完美的(至少看起来是;)):
StringCchCopyN(LPTSTR pszDest, size_t cchDest, LPCTSTR pszSrc, size_t cchSrc);
对于外行来说,strncpy()
不安全(为什么 strncpy 不安全]1)。
你需要自己写
char *mystrncpy(char *dest, const char *src, size_t nbytes)
{
char *svd = dest;
if(nbytes)
{
dest[--nbytes] = 0;
while(*src && nbytes-- )
*dest++ = *src++;
}
return svd;
}
或
char *mystrncpy(char *dest, const char *src, size_t destsize, size_t srcsize)
{
memcpy(dest, src, destsize < srcsize ? destsize : srcsize);
dest[destsize -1] = 0;
return dest;
}
您可以使用 snprintf(dest, size, "%s", source);
请注意,对于 snprintf,source
确实需要 [=12=]
终止,即使长于 size
。