在C语言中如何高效地复制和连接字符串?
扫描二维码
随时随地手机看文章
strcat (
strcpy (d, s1), s2);
char *d1 =
strcpy (d, s1);
// pass 1 over s1
strcat (d1, s2);
// pass 2 over the copy of s1 in d
strncpy (d, s1, dsize -
1);
// pass 1 over s1 plus over d up to dsize - 1
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
size_t s1len =
strlen (s1);
// pass 1 over s1
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
snprintf (d, dsize,
"%s%s", s1, s2);
const char* stpcpy (char* restrict, const char* restrict);
const char* stpncpy (char* restrict, const char* restrict, size_t);
stpcpy (stpcpy (d, s1), s2);
char *ret = stpncpy (d, dsize, s1);
// zeroes out d beyond the end of s1
dsize -= (ret - d);
stpncpy (d, dsize, s2);
// again zeroes out d beyond the end
size_t strlcpy (
char*
restrict,
const
char*
restrict,
size_t);
size_t strlcat (
char*
restrict,
const
char*
restrict,
size_t);
size_t n = strlcpy (d, s1, dsize);
dsize -= n;
d += n;
strlcpy (d, s2, dsize);
void* memccpy (void* restrict dst, const void* restrict src, int c, size_t n);
和memchr一样,它会扫描源序列以查找由其参数之一指定的字符的第一次出现。字符可以是任何值,包括零。
和strlcpy一样,它最多将指定数量的字符从源序列复制到目标序列,而不会写入超出其范围。这解决了有关strncpy和stpncpy的低效率的报怨。
和stpcpy和stpncpy类似(尽管不完全相同),它返回一个指针,该指针指向指定字符的副本(如果存在)的后一位。(回想一下stpcpy和stpncpy返回一个指向复制的NUL的指针。)这避免了strcpy和strncpy固有的低效性。
memccpy (memccpy (d, s1,
'\0', SIZE_MAX) -
1, s2,
'\0', SIZE_MAX);
char *p = memccpy (d, s1,
'\0', dsize);
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* memccpy (void* restrict dst, const void* restrict src, int c, size_t n)
{
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;
}
void* memccpy (void* restrict dst, const void* restrict src, int c, size_t n)
{
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;
}
char *p = memccpy (d, s1,
'\0', dsize);
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';
推荐阅读
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!






