前言
? C语言的库函数给了我们写代码带来极大的便利,但在使用这些函数时,也会有许许多多参数,返回值的问题,对于这些问题。我们可以通过了解函数的实现过程来深化对于库函数的使用。下面将会列举几个常用的string库函数的实现。
strlen函数
int my_strlen(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
strcpy函数
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
strcmp函数
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2);
while (*s1 == *s2)
{
if (*s1 == '\0')
return 0;
s1++;
s2++;
}
return *s1 - *s2;
}
strcat函数
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
strstr函数
char* my_strstr(const char*str1, const char* str2)
{
assert(str1 && str2);
char* s1;
char* s2;
char* cp = str1;
if (*str2 == '\0')
return str1;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cp;
}
cp++;
}
return NULL;
}
memcpy函数
void* my_memcpy(void* dest, const void*src, size_t count)
{
void* ret = dest;
assert(dest && src);
while (count--)
{
*(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 count)
{
void* ret = dest;
assert(src && dest);
if (dest < src)
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (count--)
{
*((char*)dest+count) = *((char*)src + count);
}
}
return ret;
}
总结
? 这些函数有很多相似的地方,他们所进行的操作都是通过函数传递指针对于字符串元素的数值进行更改或进行元素的查找计数操作。值得注意的是,memcpy和memmove函数传参的指针是void类型,通过这种类型,就可以让函数不止能够改变字符指针,还能对其他类型的指针进行一系列的操作,但是需要注意,void类型的指针不能被直接解引用,在对于它的操作时,需要进行强制类型转换。
|