本文主要介绍C语言中部分字符串函数及内存函数的实现
strlen
int my_strlen(char* p)
{
if (*p == '\0')
return 0;
else
return 1 + my_strlen(p + 1);
}
strcpy
char* my_strcpy(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
strncpy
char* my_strncpy(char* dest, const char* src, size_t num)
{
assert(dest);
assert(src);
char* ret = dest;
while (num--)
{
if ((*src) != '\0')
*dest++ = *src++;
else
*dest++ = 0;
}
return ret;
}
strcmp
int my_strcmp(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
while (*str1 == *str2 && *str1 && *str2)
{
str1++;
str2++;
}
return (*str1 - *str2);
}
strcat
char* my_strcat(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
strncat
char* my_strncat(char* dest, const char* src, size_t num)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (num--)
{
if ((*src) != '\0')
*dest++ = *src++;
else
{
*dest = *src;
break;
}
}
return ret;
}
strstr
char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
char* p = str1;
char* s1 = str1;
char* s2 = str2;
while (*s1)
{
s1 = str1;
s2 = str2;
while (*s1 && *s2)
{
p = str1;
if (*s1 != *s2)
{
break;
}
else
{
s1++;
s2++;
}
}
if (*s2 == '\0')
return p;
str1++;
}
return NULL;
}
atoi
enum State
{
VALID,
INVALID
}state = INVALID;
int my_atoi(const char* str)
{
int flag = 1;
assert(str);
if (*str == '\0')
{
return 0;
}
while (isspace(*str))
{
str++;
}
if (*str == '-')
{
flag = -1;
str++;
}
else if (*str == '+')
{
str++;
}
long long ret = 0;
while (*str != '\0')
{
if (isdigit(*str))
{
ret = ret * 10 + flag*(*str - '0');
if (ret<INT_MIN || ret >INT_MAX)
{
return 0;
}
}
else
{
return (int)ret;
}
str++;
}
state = VALID;
return (int)ret;
}
memcpy
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
memmove
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
if ((char*)dest < (char*)src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else if ((char*)dest > (char*)src)
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
else
return ret;
return ret;
}