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一樣,它會掃描源序列以查找由其參數(shù)之一指定的字符的第一次出現(xiàn)。字符可以是任何值,包括零。
和strlcpy一樣,它最多將指定數(shù)量的字符從源序列復(fù)制到目標(biāo)序列,而不會寫入超出其范圍。這解決了有關(guān)strncpy和stpncpy的低效率的報怨。
和stpcpy和stpncpy類似(盡管不完全相同),它返回一個指針,該指針指向指定字符的副本(如果存在)的后一位。(回想一下stpcpy和stpncpy返回一個指向復(fù)制的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);
安卓系統(tǒng)中的memccpy函數(shù),
蘋果Mac OS X中的memccpy函數(shù),
BlackBerry Native SDK 的memccpy函數(shù),
Compaq Run-Time Library for VAX中的memccpy函數(shù),
微軟Visual Studio C Runtime Library中的 memccpy 函數(shù),
IBM z/OS 中的memccpy函數(shù).
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';
推薦閱讀
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!






