今天我们学点库函数
字符函数和字符串函数
求字符串长度函数->strlen
strlen需要的头文件是string.h ,那它的作用是什么呢??
他是来求字符串长度的,统计的是’\0’前的字符串长度
#include<stdio.h> #include<string.h> int main() { char arr1[] = "abcdef"; size_t len = strlen(arr1); printf("%d", len); return 0; }
size_t是无符号的意思
学会了strlen函数怎么使用,那我们现在模拟实现一下strlen
之前讲过三种方式来实现,大家是否还记得呢?分别是计数的方式,函数递归的方式,还有我们的指针
计数器的方式
#include<stdio.h> #include<assert.h> size_t my_strlen(const char* arr) { assert(*arr); int count = 0; while (*arr++) { count++; } return count; } int main() { char arr[] = "abcdef"; size_t len = my_strlen(arr); printf("%d\n", len); return 0; }
函数递归
#include<stdio.h> size_t my_strlen(const char* arr) { if (*arr != 0) { return 1 + my_strlen(arr + 1); } } int main() { char arr[] = "abcdef"; size_t len = my_strlen(arr); printf("%d\n", len); return 0; }
指针运算
#include<stdio.h> int my_strlen(char* arr) { char* str = arr; while (*arr) { arr++; } return arr - str; } int main() { char arr[] = "abcdef"; int len = my_strlen(arr); printf("%d\n", len); return 0; }
strcpy函数
strcpy的作用是把我们的后面字符拷贝到前面字符,但是我们也有相应的前提
源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
那我们用代码来看看效果吧
#include<stdio.h> #include<string.h> int main() { char arr1[] = "abcdef"; char arr2[] = "xxx"; printf("%s", strcpy(arr1, arr2)); return 0; }
我们可以看到其实我们在拷贝的时候,把’\0‘也拷贝进去,下面再给大家看一个特殊例子
观察到我们拷贝的时候,是\0之前,这也符合我们上面的规定
现在我们写一个函数来模拟实现这个效果吧
#include<stdio.h> #include<assert.h> char* my_strcpy(char* dest, const char* src) { assert(*dest && *src); char* ret = dest; while (*dest++ = *src++) { ; } return dest; } int main() { char arr1[] = "xxxxx"; char arr2[] = "abcd"; char* arr3 = my_strcpy(arr1, arr2); printf("%s\n", arr1); return 0; }
我们只是模拟实现,不可能实现vs中的strcpy的功能,比如上面我们的代码缺陷就是不能自己copy自己,会存在覆盖现象,导致不能达到我们想要的效果
stract
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
这是一个追加的字符串,比如我们要想在arr1字符串后面追加一个hello,这样就可以用我们的strcat
我们用代码看一下它该怎么使用
#include<stdio.h> #include<string.h> int main() { char arr1[] = "hello"; char arr2[] = " CSDN"; char* ret = strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
那我们接下来就是模拟实现函数
#include<stdio.h> #include<assert.h> char* my_strcat(char* dest, const char* str) { assert(*dest && *str); char* ret = dest; while (*++dest) { ; } while (*dest++ = *str++ ) { ; } return ret; } int main() { char arr1[] = "hello"; char arr2[] = " CSDN"; char* ret = my_strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
strcmp
这是一个比较字符串的函数,但是大家可不要误以为是比较长度的,它的作用是比较ASCII的,一个字符一个字符进行比较
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
所以我们的strcmp函数的返回值应该是整型
下面我们就写个代码看看效果吧
#include<stdio.h> #include<string.h> int main() { char arr1[] = "abcde"; char arr2[] = "abcdq"; int len = strcmp(arr1, arr2); printf("%d", len); return 0; }
那我们也来模拟实现一下strcmp
#include<stdio.h> #include<assert.h> int my_strcmp(const char* dest, const char* str) { assert(*dest && *str); while (*dest == *str && *dest && *str) { dest++; str++; } if (dest==NULL) { return 0; } return *dest - *str; } int main() { char arr1[] = "abcde"; char arr2[] = "abcdq"; int len = my_strcmp(arr1, arr2); printf("%d", len); return 0; }
strstr
#include <stdio.h> #include <string.h> int main() { char str[] = "This is a simple string"; char* pch; pch = strstr(str, "simple"); if (pch == NULL) { printf("找不到\n"); } else { printf("找到了\n"); } return 0; }
模拟实现
#include<stdio.h> #include<assert.h> char* my_strstr(const char* dest, const char* str) { assert(dest && str); char* s1 = dest; char* s2 = str; char* cul = dest; while (*cul) { s1 = cul; s2 = str; while (*s1 == *s2) { s1++; s2++; if (*s2) { return cul; } } cul++; } return NULL; } int main() { char str[] = "This is a simple string"; char arr[] = "simple"; char* p = my_strstr(str, arr); if (p == NULL) { printf("找不到\n"); } else { printf("找到了\n"); } return 0; }
strstr最大作用就是找这个里面有没有我们想要的字符串,如果有就返回查找字符串内该字符串的地址,如果没有就返回空指针