模拟实现strcmp,strcpy,strlen,strcat,strstr
目录
前言
一、模拟实现strlen
二、模拟实现strcmp
三、模拟实现strcpy
四、模拟实现strcat
五、模拟实现strstr
总结
前言
这篇文章主要讲解了库函数的模拟实现,包含strcmp,strcpy,strlen,strcat,strstr
一、模拟实现strlen
strlen函数用于计算字符串的长度,不包括字符串结束符'\0'。
计算器法:
#include<stdio.h>
#include<string.h>
int my_strlen(char* a) {if (*a == '\0')return 0;int cnt = 0;while (*a++)cnt++;return cnt;
}
int main() {char a1[] = "fjfsdjfsdjsg";int len1 = my_strlen(a1);int len2 = strlen(a1);printf("%d\n", len1);printf("%d\n", len2);return 0;
}
二、模拟实现strcmp
在C语言中,strcmp函数用于比较两个字符串的大小。其基本原理是逐个比较两个字符串的字符,直到找到不相等的字符或遇到字符串结束符\0。如果两个字符串相等,则返回0;如果第一个字符串大于第二个字符串,则返回正值;反之则返回负值。
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* a,const char* b)
{assert(a != NULL); assert(b != NULL);while ((*a == *b) && (*a != '\n')) {a++; b++;}return *a - *b;
}
int main() {char a1[] = "hellsdjfsdhjjsg";char a2[] = "hello,world";int ret = my_strcmp(a1, a2);if (ret == 0) {printf("两个字符串相等\n");}else if (ret > 0) {printf("第一个字符串大于第二个字符串\n");}else {printf("第一个字符串小于第二个字符串\n");}return 0;
}
在上述代码中,my_strcmp函数首先使用assert确保输入的字符串不为空。然后,通过一个while循环逐个比较两个字符串的字符。如果字符相等且未到达字符串结束符\0,则继续比较下一个字符。循环结束后,返回两个字符串当前字符的差值。
在main函数中,我们定义了两个字符串str1和str2,并调用my_strcmp函数进行比较。根据返回值,判断并输出两个字符串的大小关系。
重要考虑事项
在实现strcmp函数时,需要注意以下几点:
-
空指针检查:确保输入的字符串不为空,否则可能会导致程序崩溃。
-
字符比较:逐个比较字符串的字符,直到找到不相等的字符或遇到字符串结束符\0。
-
返回值:根据两个字符串当前字符的差值返回结果。如果相等返回0,如果第一个字符串大于第二个字符串返回正值,反之返回负值。
三、模拟实现strcpy
在C语言中,strcpy函数用于将源字符串复制到目标字符串中。我们可以通过逐步优化的代码示例,手动实现这个功能。
首先,我们可以实现一个基础版本的strcpy函数。这个函数需要两个参数:目标字符串和源字符串。我们使用assert来确保传入的指针不为空,然后使用while循环将源字符串的内容逐个字符地复制到目标字符串中,直到遇到字符串结束符\0。
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strlen(char* a) {if (*a == '\0')return 0;int cnt = 0;while (*a++)cnt++;return cnt;
}
void my_strcpy(char* a, char* b) {assert(a != NULL);assert(b != NULL);while (*b) {*a = *b;a++; b++;}*a = *b;
}
int main() {char a1[] = "fjfsdjfsdjsg";//int len1 = my_strlen(a1);//int len2 = strlen(a1);//printf("%d\n", len1);//printf("%d\n", len2);char a2[] = "hello,world";my_strcpy(a1, a2);printf("%s\n",a1);printf("%s\n", a2);return 0;
}
四、模拟实现strcat
在C语言中,strcat函数用于将源字符串追加到目标字符串的末尾。其工作原理是找到目标字符串的结尾(即\0),然后从此处开始将源字符串逐个字符复制到目标字符串中,直到遇到源字符串的结束标志\0
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<windows.h>
char* my_strcat( char* a,const char* b)
{assert(a != NULL); assert(b != NULL);char* ret = a;while (*a)a++;while (*a++ = *b++);return ret;
}
int main() {char a1[] = "hellsdjfsdhjjsg";char a2[] = "hello,world";char* ret = my_strcat(a1, a2);char* ret2 = strcat(a1, a2);printf("%s\n", ret);printf("%s\n", ret2);system("pause");return 0;
}
-
初始化和断言:首先,定义一个临时变量ret来保存目标字符串的起始地址,并使用assert函数确保传入的指针不为空1。
-
找到目标字符串的结尾:通过一个while循环,将dest指针移动到目标字符串的结尾(即\0的位置)。
-
复制源字符串:通过另一个while循环,将源字符串的每个字符逐个复制到目标字符串中,直到遇到源字符串的结束标志\0。
-
返回结果:最后,返回目标字符串的起始地址。
注意事项
-
目标空间大小:确保目标字符串的空间足够大,以容纳源字符串的内容。
-
字符串结束标志:源字符串和目标字符串都必须以\0结束
五、模拟实现strstr
在 C 语言中,strstr 函数用于查找一个字符串(b)在另一个字符串(a)中首次出现的位置。如果找到了,它会返回 a中 b 首次出现的位置的指针;如果没有找到,它会返回一个空指针。
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<windows.h>
char* my_strstr(char* a, const char* b)
{assert(a != NULL); assert(b != NULL);const char* s1 = a;const char* s2 = b;const char* p = a;while (*p != '\0') {s1 = p;s2 = b;while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {s1++;s2++;}if (*s2 == '\0') {return (char*)p;}p++;}return NULL;
}
int main() {char a1[] = "hellsdjfsdhjjsg";char a2[] = "hello,world";char* ret = my_strstr(a1, a2);if(ret!=NULL)printf("%s\n", ret);else printf("没有找到\n");//system("pause");return 0;
}
在这个自定义的 My_strstr 函数中,我们首先使用 assert 确保传入的两个字符串指针都不是空指针。然后,我们使用两个指针 s1 和 s2 来遍历a 和 b。如果在 a 中找到了b 的完整匹配,我们就返回 a中匹配的起始位置的指针。如果没有找到匹配,我们就返回一个空指针。
这种实现方法的关键在于,我们需要在a 中逐个字符地查找 b 的首次出现。我们使用一个循环来逐个检查 a 的每个字符,如果当前字符开始的子字符串不匹配 b,我们就移动到 str1 的下一个字符并重复这个过程。如果我们找到了一个匹配,我们就返回当前的位置。如果我们遍历了整个 a 也没有找到匹配,我们就返回 NULL。
总结
关于本篇的内容就结束了,对你有帮助的可以点个赞支持一下