C语言中有很多库函数,本篇博客来实现一些简单的库函数。
1.strlen函数的实现
strlen函数的主要功能是计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
int mystrlen(const char* str){
//count为字符串长度
int count = 0;
//利用while循环来实现字符串长度的实现
while (*str){
count++;
str++;
}
return count;
}
int main() {
char str[] = "abcdef";
int i = mystrlen(str);
printf("%d",i);
}
2.strcpy函数的实现
strcpy函数会把 src 所指向的字符串复制到 dest。
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
#include
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
//assert来判定main函数传参是否正确
assert(dest != NULL);
assert(src != NULL);
while (*src){
*dest = *src;
dest++;
src++;
}
return ret;
}
int main() {
char arr[1024] = { 0 };
char brr[] = "abc";
printf("%s",my_strcpy(arr, brr));
}
3.memcpy函数的实现
memcpy函数会从存储区 str2 复制 n 个字节到存储区 str1。
void* my_memcpy(char* arr, char* brr, size_t num) {
assert(arr != ' ');
assert(brr != ' ');
assert(num != 0);
char* p1 = (char*)arr;
char* p2 = (char*)brr;
for (size_t i = 0; i < num; i++) {
p1[i] = p2[i];
}
return arr;
}
4.memmove函数的实现
memmove函数会从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
void* my_memmove(char* arr, char* brr, size_t num) {
assert(arr != ' ');
assert(brr != ' ');
assert(num != 0);
char* p1 = (char*)arr;
char* p2 = (char*)brr;
//判断一下数组是否重叠,如果重叠,则需要逆序赋值
if (*arr >= *brr && *brr <= *arr) {
for (long i = (long)(num - 1); i >= 0; i--) {
p1[i] = p2[i];
}
}
else {
for (size_t i = 0; i < num; i++) {
p1[i] = p2[i];
}
}
return arr;
}
5.strstr函数的实现
strstr函数会在字符串 str1 中查找第一次出现字符串 str2的位置,不包含终止符 ' '。
//本函数使用了三个指针
//black指针会指向str1也就是本函数的arr
//red函数也会指向arr
//sub函数会指向brr
char* mystrstr(char* arr,char* brr) {
char* black = arr;
while (*black != ' ') {
char* red = black;
char* sub = brr;
while (*sub != ' ' && *red != ' ' && *sub == *red) {
red++;
sub++;
}
if (*sub == ' ') {
return black;
}
else if (*red == ' ') {
black++;
}
else if (*red != *sub) {
black++;
}
}
return NULL;
}
6.strcat函数的实现
strcat函数会把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
char* my_strcat(char* arr, char* brr) {
assert(arr != ' ');
assert(brr != ' ');
int i = 0;
while (arr[i] != ' ') {
i++;
}
int j = 0;
while (brr[j] != ' ') {
arr[i + j] = brr[j];
j++;
}
arr[i + j] == ' ';
return arr;
}
7.strcmp函数的实现
strcmp库函数会把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
#include#include int my_strcmp(const char* str1, const char* str2) { assert(str1 != NULL); assert(str2 != NULL); while (str1 != ' ' && str2 != ' ') { if (*str1 > *str2) { return 1; } else if (*str1 < *str2) { return -1; } else { str1++; str2++; } } return 0; } int main() { char str1[1024] = "hello"; char str2[1024] = "hell"; printf("%d", my_strcmp(str1, str2)); }
以上就是一些简单的库函数的实现,总体不太难理解,需要明白原来的库函数的功能即可。



