其他
在C语言中如何高效地复制和连接字符串?
strcat (d1, s2); // pass 2 over the copy of s1 in d
d[dsize - 1] = '\0'; // remember to nul-terminate
size_t n = strlen (d); // pass 2 over copy of s1 in d
strncat (d, s2, dsize - n - 1); // pass 3 over copy of s1 in d
if (dsize <= s1len)
s1len = dsize - 1; // no need to nul-terminate
memcpy (d, s1, s1len); // pass 2 over s1
size_t s2len = strlen (s2); // pass 1 over s2
if (dsize - s1len <= s2len)
s2len = dsize - s1len - 1;
memcpy (d + s1len, s2, s2len); // pass 2, over s2
d[s1len + s1len] = '\0'; // nul-terminate result
const char* stpncpy (char* restrict, const char* restrict, size_t);
dsize -= (ret - d);
stpncpy (d, dsize, s2); // again zeroes out d beyond the end
size_t strlcat (char* restrict, const char* restrict, size_t);
dsize -= n;
d += n;
strlcpy (d, s2, dsize);
和memchr一样,它会扫描源序列以查找由其参数之一指定的字符的第一次出现。字符可以是任何值,包括零。
和strlcpy一样,它最多将指定数量的字符从源序列复制到目标序列,而不会写入超出其范围。这解决了有关strncpy和stpncpy的低效率的报怨。
和stpcpy和stpncpy类似(尽管不完全相同),它返回一个指针,该指针指向指定字符的副本(如果存在)的后一位。(回想一下stpcpy和stpncpy返回一个指向复制的NUL的指针。)这避免了strcpy和strncpy固有的低效性。
dsize -= (p - d - 1);
memccpy (p - 1, s2, '\0', dsize);
安卓系统中的memccpy函数,
苹果Mac OS X中的memccpy函数,
BlackBerry Native SDK 的memccpy函数,
Compaq Run-Time Library for VAX中的memccpy函数,
微软Visual Studio C Runtime Library中的 memccpy 函数,
IBM z/OS 中的memccpy函数.
{
void *pc = memchr (src, c, n);
void *ret;
if (pc)
{
n = (char*)pc - (char*)src + 1;
ret = (char*)dst + n;
}
else
ret = 0;
memcpy (dst, src, n);
return ret;
}
{
const char *s = src;
for (char *ret = dst; n; ++ret, ++s, --n)
{
*ret = *s;
if ((unsigned char)*ret == (unsigned char)c)
return ret + 1;
}
return 0;
}
if (p)
{
--p;
p = memccpy (p, "/", '\0', dsize - (p - d));
if (p)
{
--p;
p = memccpy (p, s2, '\0', dsize - (p - d));
}
}
if (!p)
d[dsize - 1] = '\0';
推荐阅读
【01】Rust能够取代C语言吗?【02】C语言指针终极指南!(附详尽图示和代码)【03】如何把C++的源程序改写成C语言【04】17条嵌入式C语言编程小知识总结【05】一文教你搞懂C语言的Q格式使用