目录
strlen函数
strlen函数是求字符串长度的,统计的是字符串中\0之前出现的字符个数,他所需的头文件是#include <string.h>
可以看到strlen函数的返回值是size_t类型,也就是unsigned int类型;
函数示例:
#include <stdio.h> #include <string.h> int main() { char arr[] = "abcdef"; printf("%d\n", strlen(arr)); return 0; }
运行结果:
模拟实现:
#include <assert.h> size_t my_strlen(const char* str) { assert(str); const char* start = str; const char* end = str; while (*end != '\0') { end++; } return end - start; } int main() { char arr[] = "abcdef"; int len = my_strlen(arr); printf("%d\n", len); return 0; }
运行结果如下:
strcpy函数
用于字符串拷贝,将一个字符串拷贝给另外一个字符串,他所需的头文件是
#include <string.h>
返回值为char*类型,是目标字符串的首字符的指针(地址)
函数示例:
int main() { char arr[10] = "xxxxxxxxx"; const char* p = "abcdef"; strcpy(arr, p); printf("%s\n", arr); return 0; }
运行结果如下:
模拟实现:
char* my_strcpy(char* dest, const char* src) { assert(dest); assert(src); char* ret = dest; while (*dest++ = *src++) { ; } return ret; } int main() { char arr1[20] = "abc"; char arr2[] = "hello world"; printf("%s\n", my_strcpy(arr1, arr2)); return 0; }
运行结果:
strcat函数
strcat函数是向一个字符串,追加另外一个字符串
返回值是char*,是原字符串的首字符的地址(指针)
头文件:#include<string.h>
函数示例:
int main() { char p1[20] = "xxxxxxxx"; char p2[20] = "helo world"; strcat(p1, p2); printf("%s", p1); return 0; }
运行结果:
模拟实现:
char* my_strcat(char* dest, const char*src) { //1.找目标空间中的\0 char* cur = dest; while (*cur) { cur++; } //2.拷贝源头数据到\0之后的空间 while (*cur++ = *src++) { ; } return dest; } int main() { char arr1[20] = "hello "; char arr2[] = "world"; printf("%s\n", my_strcat(arr1, arr2)); return 0; }
运行结果:
strcmp函数
strcmp函数是比较两个字符串的大小。
返回值是int类型,有三种返回值,一种为0,一种为大于0的数,一种为小于0的数。
规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
头文件:#include<string.h>
函数示例:
int main() { char ch1[20] = "abe"; char ch2[20] = "abc"; int n = strcmp(ch1, ch2); if (n == 0) printf("两个相等\n"); if (n > 0) printf("ch1大\n"); if (n < 0) printf("ch2大\n"); return 0; }
运行结果:
模拟实现:
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; } int main() { char arr1[] = "abe"; char arr2[] = "abc"; int ret = my_strcmp(arr1, arr2); if (ret < 0) printf("arr1<arr2\n"); else if(ret>0) printf("arr1>arr2\n"); else printf("arr1==arr2\n"); printf("%d\n", ret); return 0; }
运行结果:
strncpy函数
strncpy函数是为字符串复制函数,和strcpy函数用处一样但是 strcpy函数可以控制要拷贝的字符个数
参数是第一个为目标字符串的地址(指针),第二个为要复制的字符串的首字符的地址(指针),第三个为我们需要复制字符的个数。
返回值是char*类型,是目标字符串的地址。
函数示例:
int main() { char arr1[20] = "abcdefghi"; char arr2[] = "xxxx"; strncpy(arr1, arr2, 3); printf("%s\n", arr1); return 0; }
运行结果:
模拟实现:
char* my_strncpy(char* arr1, char* arr2, int num) { assert(arr1); assert(arr2); int i = 0; for (int i = 0; i < num; i++) { *(arr1 + i) = *(arr2 + i); } return arr1; } int main() {//模拟实现strncpy函数 char arr1[20] = "abcdefghi" ; char arr2[20] = "xxxxx" ; int num=0; scanf("%d", &num); char* p = my_strncpy(arr1,arr2, num); printf("%s", p); return 0; }
运行结果:
strncat函数
strncat函数是strcat函数差不多,但是可以控制想要的个数来追加字符串。
参数:第一个为目标字符串的地址(指针),第二个为要追加的字符串,第三个为你想要追加字符的个数。
返回值:为char*类型,是目标字符串的地址。
头文件:#include<string.h>
int main() { char arr1[20] = "abc"; strncat(arr1, arr1, 3); printf("%s\n", arr1); return 0; }
运行结果:
模拟实现:
char* my_strncat(char* dest, const char*src,size_t num) { //1.找目标空间中的\0 char* cur = dest; while (*cur) { cur++; } for (int i = 0; i < num; i++) { *cur++ = *src + i; } return dest; } // int main() { char arr1[20] = "hello "; char arr2[] = "world"; printf("%s\n", my_strncat(arr1, arr2,2)); return 0; }
运行结果:
strncmp函数
strncmp函数和strcmp函数差不多,但是它可以控制比较字符的个数。
参数:第一个参数是第一个字符串,第二个参数是第二个字符串,第三个参数是我们想要的最多比较几个字符的个数。
返回值: 为int类型,有三种可能,一种为0,一种为大于0的数,一种为小于0的数。
头文件:#include<string.h>
规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
函数示例:
int main() { char ch1[10] = "abcdefghi"; char ch2[10] = "abe"; int num = 2; int ret = strncmp(ch1, ch2, num); if (ret == 0) { printf("ch1=ch2\n"); } if (ret > 0) { printf("ch1>ch2\n"); } if (ret < 0) { printf("ch1<ch2\n"); } return 0; }
运行结果:
模拟实现:
int my_strncmp(const char* s1, const char* s2,size_t num) { assert(s1 && s2); int i = 0; for(i=0;i<num;i++) { if (*(s1 + i) == *(s2 + i)) { s1++; s2++; } if (*s1 == '\0'&& *s2 == '\0') { return 0; } } return *s1 - *s2; } int main() { char arr1[] = "abe"; char arr2[] = "abc"; int ret = my_strncmp(arr1, arr2, 2); if (ret < 0) printf("arr1<arr2\n"); else if(ret>0) printf("arr1>arr2\n"); else printf("arr1==arr2\n"); return 0; }
运行结果:
strstr函数
strstr函数是在一个字符串中找另外一个字符串是否存在
- 存在,返回字串第一次出现的位置
- 不存在,返回NULL
头文件:#include<string.h>
函数示例:
int main() { char arr1[] = "abcdefg"; char arr2[] = "ef"; char* p = strstr(arr1, arr2); if (p == NULL) { printf("不存在\n"); } else { printf("%s\n", p); } return 0; }
运行结果:
函数模拟:
char* my_strstr(const char* str1, const char* str2) { const char* s1 = str1; const char* s2 = str2; const char* p = str1; if (*str2 == '\0') { return str1; } while (*p) { s1 = p; s2 = str2; while (*s1!='\0' && *s2!='\0' && (*s1 == *s2)) { s1++; s2++; } if (*s2 == '\0') { return (char*)p;//找到了 } p++; } return NULL;//找不到子串 } int main() { char arr1[] = "abcdefabcdef"; char arr2[] = "cdq"; char* p = my_strstr(arr1, arr2); if (p == NULL) { printf("不存在\n"); } else { printf("%s\n", p); } return 0; }
运行结果: