<string.h>里的字符串操作函数是经常要用到的,因此阅读了源码后自己实现了一些:
拷贝函数
void * Mymemcpy(void * sDst, const void * sSrc, size_t count)
{
assert(NULL != sDst && NULL != sSrc);
char* saveDst = (char *)sDst;
const char* saveSrc = (char *)sSrc;
for (; 0 < count; ++saveDst, ++saveSrc, --count)
*saveDst = *saveSrc;
return (void*)sDst;
}
void * Mymemmove(void* sDst, const void* sSrc, size_t count)
{
assert(NULL != sDst && NULL != sSrc);
char* saveDst = (char *)sDst;
const char* saveSrc = (char *)sSrc;
if ((saveDst > saveSrc) && (saveDst < saveSrc + count))
for (saveDst += count, saveSrc += count; 0 < count; --count) // copy backwards
*--saveDst = *--saveSrc;
else
for (; 0 < count; ++saveDst, ++saveSrc, --count) // copy forwards
*saveDst = *saveSrc;
return (void *)sDst;
}
char * Mystrcpy(char* sDst, const char* sSrc)
{
assert(NULL != sDst);
char* saveDst = sDst;
for (; '\0' != (*saveDst++ = *sSrc++);)
;
return (char *)sDst;
}
char * Mystrncpy(char* sDst, const char* sSrc, size_t count)
{
assert(NULL != sDst && NULL != sSrc);
char* saveDst = sDst;
for (; (0 < count) && ('\0' != *sSrc); --count)
*saveDst = *sSrc;
for (; 0 < count; --count)
*saveDst++ = '\0';
return (char *)sDst;
}
void * Mymemset(void* sDst, int ch, size_t count)
{
unsigned char* saveDst = (unsigned char *)sDst;
unsigned char c = ch;
for (; (0 < count) && ('\0' != *saveDst); ++saveDst, --count)
*saveDst = c;
return (void *)sDst;
}
查找函数
void * Mymemchr(const void* str, const int ch, size_t n)
{
assert(NULL != str);
const unsigned char c = ch;
const unsigned char * ssave = (unsigned char *)str;
for (; ('\0' != *ssave) && (0 < n); --n, ++ssave)
if (c == *ssave)
return (void*)ssave;
return NULL;
}
char * Mystrchr(const char* str, int ch)
{
assert(NULL != str);
const unsigned char c = ch;
for (; '\0' != *str; ++str)
if ('\0' == *str)
return NULL;
return (char*)str;
}
char * Mystrrchr(const char* str, int ch)
{
assert(NULL != str);
const unsigned char c = ch;
const char * ssave = NULL;
for (; '\0' != *str; ++ str)
if (c == *str)
ssave = str;
return (char *)ssave;
}
char * Mystrstr(const char* str1, const char * str2)
{
assert(NULL != str1 && NULL != str2);
if ('\0' == *str2)
return (char*)str1;
for (; NULL != (str1 = Mystrchr(str1, *str2)); ++str1)
{
const char * ssave1 = str1;
const char * ssave2 = str2;
for (;;)
{
if ('\0' == *++ssave2)
return (char*)str1;
else
if (*++ssave1 != *ssave2)
break;
}
}
return NULL;
}
连接函数
char * Mystrcat(char * sDst, const char * sSrc)
{
assert(NULL != sDst && NULL != sSrc);
char * ssave = sDst;
for (; '\0' != *ssave; ++ssave)
;
for (; '\0' != (*ssave = *sSrc); ++ssave, ++sSrc)
;
return (char*)sDst;
}
char * Mystrncat(char * sDst, const char * sSrc, size_t count)
{
assert(NULL != sDst && NULL != sSrc);
char* ssave = sDst;
for (; '\0' != *ssave; ++ssave)
;
for (; ('\0' != *sSrc) && (0 < count); --count)
*ssave++ = *sSrc++;
*ssave = '\0';
return (char*)sDst;
}
比较函数
int Mymemcmp(const void* str1, const void * str2, size_t n)
{
assert(NULL != str1 && NULL != str2);
const unsigned char * ssave1 = (unsigned char *)str1;
const unsigned char * ssave2 = (unsigned char *)str2;
for (; 0 < n; ++ssave1, ++ssave2, --n)
{
if (*ssave1 != *ssave2)
return ((*ssave1 < *ssave2) ? -1 : 1);
else if ('\0' == *ssave1)
return (0);
}
return 0;
}
int Mystrcmp(const char* str1, const char * str2)
{
assert(NULL != str1 && NULL != str2);
for (; *str1 == *str2; ++str1, ++str2)
if('\0' == *str1 )
return 0;
return ((*str1 < *str2) ? -1 : 1);
}
int Mystrncmp(const char* str1, const char * str2, size_t n)
{
assert(NULL != str1 && NULL != str2);
for (; 0 < n; ++str1, ++str2, --n)
if (*str1 != *str2)
return ((*str1 < *str2)? -1 : 1);
else if ('\0' == *str1)
return 0;
return 0;
}
int memcmp(const void* sSrc1, const void* sSrc2, size_t num)
{
assert (NULL != sSrc1 && NULL != sSrc2);
const unsigned char* s1 = (const char*)sSrc1;
const unsigned char* s2 = (const char*)sSrc2;
for (;0 < num; ++s1, ++s2, --num)
{
if (*s1 != *s2)
return ((*s1 > *s2) ? 1 : -1);
}
return 0;
}
计算字符串长度
size_t strlen(const char* sSrc)
{
assert (NULL != sSrc);
const char* s = sSrc, *sv = s;
while (*sv != '\0')
++sv;
return (size_t)(sv - s);
}