函数描述: 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; }③代码的运行结果如下:
strstr1、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、赋值运算返回的结果是等号左边的变量