*标准库string.h的内置函数的模拟实现
- strlen
函数描述:
1、C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
①函数模拟实现:
//strlen模拟实现
int my_strlen(const char*str){
int n = 0;
while (*str){
str++;
n++;
}
return n;
}
int main(){
char *str = "qwerty";
printf("%d\n", my_strlen(str));
return 0;
}
②代码的运行结果如下:
- strcpy
函数描述:
1、 C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
2、需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
①函数模拟实现:
//strcpy模拟实现
char * my_strcpy(char * dst, const char* src){
char*ret = dst;
while (*dst++ = *src++);
return ret;
}
int main(){
char *str1 = "hellohello";
printf("%s\n", str1);
char str2[] = { 0 };
my_strcpy(str2, str1);
printf("%s\n", str2);
return 0;
}
②代码的运行结果如下:
- strcat
函数描述:
1、C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
①函数模拟实现
//strcat模拟实现
char*my_strcat(char* str1, char* str2){
assert(str1);
assert(str2);
while (*str1)
{
str1++;
}
while (*str1++ = *str2++);
return str1;
}
int main(){
char str1[20] = "hello";//保证有充足的空间存储字符串
char str2[] = "world";
char str3[20] = { 0 };
my_strcat(str1, str2);
printf("%s\n\n", str1);
my_strcat(str3, str1);
my_strcat(str3, str2);
printf("%s\n", str3);
return 0;
②代码的运行结果如下:
- strcmp
函数描述:
1、strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数;
2、strcmp函数声明为int strcmp(const char *str1, const char *str2);
①字符串比较大小规则如下:
1、从左至右依次比较,ASCII码值大的则字符串就比较大;
2、第一个字符串大于第二个字符串返回大于0的数字;若小于则返回小于0 的数字,若俩个字符串相等则返回0。
②代码模拟实现:
//strcmp模拟实现
int my_strcmp(const char *str1, const char*str2){
assert(str1);
assert(str2);
while (*str1&&*str2){
if (*str1 > *str2){
return 1;
}
else if (*str1 < *str2){
return -1;
}
else{
str1++;
str2++;
}
}
if (*str1){
return 1;
}
if (*str2){
return -1;
}
else {
return 0;
}
}
int main(){
char *str1 = "abcd";
char *str2 = "abc";
char *str3 = "cba";
char *str4 = "cba";
printf("%d\n", my_strcmp(str1, str2));
printf("%d\n", my_strcmp(str2, str3));
printf("%d\n", my_strcmp(str4, str3));
return 0;
}
③代码的运行结果如下:
- strstr
1、char *strstr(const char *haystack, const char *needle);
2、函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null;
3、可以使用该函数对url进行分割,通过查找url中:以及 / 来区分字符分割出协议以及域名;
①函数模拟实现:
char * my_strstr(char* str1, char* str2){
assert(str1);
assert(str2);
while (*str1 != '\0'){
if (*str1 != *str2){
++str1;
}
else {
char* str1_start = str1++;
char* str2_start = str2++;
while (*str1 == *str2 && *str2 != '\0'){
++str1;
++str2;
}
if (*str2 == '\0'){
return str1_start;
}
else{
str2 = str2_start;
str1 = str1_start + 1;
}
}
}
return NULL;
}
int main(){
char* url = "https://hahah.com/index";
char protocol[128];
char *pos1 = my_strstr(url, ":");
strncpy(protocol, url, pos1 - url);
protocol[pos1 - url] = '\0';
printf("%s\n", protocol);
char domain_name[128];
char *pos2 = url + (pos1 - url) + 3;
char* end = my_strstr(pos2, "/");
strncpy(domain_name, pos2, end - pos2);
domain_name[end - pos2] = '\0';
printf("%s\n", domain_name);
return 0;
}
②代码的运行结果如下:
小知识点总结
1、 后置++优先级高于*
2、\0的ASCII码值为0
3、赋值运算返回的结果是等号左边的变量