前言
求字符串长度
strlen
长度不受限制的字符串函数
strcpy
strcat
strcmp
长度受限制的字符串函数介绍
strncpy
strncat
strncmp
字符串查找
strstr
strtok
一. strlen
1. ‘\0’
‘\0’是字符串结束的表示
而strlen是统计直到‘\0’位置 不包括‘\0’
例如这个上面这段代码 输出的就是5 (因为遇到\0截止了)
2. 返回值
strlen的返回值是一个无符号整数 所以它一定是正数
我们来看下面这段代码
int main() { char* str1 = "abcdef"; char* str2 = "bbb"; if (strlen(str2)-strlen(str1)>0) { printf(">"); } else { printf("<"); } return 0; }
猜猜看 上面这段代码打印出来的结果是什么呢?
正确答案是‘>’
因为strlen函数的返回值是一个无符号数 所以说得到的数一定是大于等于0的
如果想要它打印出小于号我们只需要再c后面加上一个\0 这样他们相减等于0 就可以打印出一个小于号了
3. strlen的模拟实现
我们首先来看cpp官网上对于strlen的解释
我们可以发现
strlen函数的返回时是一个无符号数
strlen函数的参数是一个char类型的指针
那我们来尝试实现这个函数
首先来画个图 解释下实现的原理
我们设计一个指针p 指向字符串的起始地址 另外再设计一个临时变量count
进入循环当中 每次p++ count++
直到p指向\0的时候 我们返回count的数值
代码表示如下
size_t my_strlen(char * p) { assert(*p);//断言下 确保p不是空指针 unsigned count = 0; while (*p)//当p的指向的内容不为0时 执行下方操作 { p++; count++; } return count; }
实现效果图如下
可以完美运行
二. strcpy
我们先来看cpp中的strcpy函数
char * strcpy ( char * destination, const char * source );
我们可以发现 它的返回值是一个char类型的指针
它的参数有两个都是指针 一个指向目的地 一个指向源地址
1. 源字符串必须以’\0’结束
这个很好理解 如果源字符不是以’\0’结束的话 那么它要拷贝的长度是未知的
我们不能很好的控制这个函数
2. 会将源字符中的’\0’拷贝到目标空间中
代码如下
int main() { char arr1[20] = { 1 }; char arr2[] = "hello world"; strcpy(arr1, arr2) return 0; }
我们可以发现 arr1中的代码变成了hello world 而不是hello world 11111… 这样就可以证明 它会将’\0’拷贝到目的地中
3. 目标空间要足够大 能够存放需要拷贝的数据
这个是常识了 如果目标空间不够大会报错
如下图所示
4. 模拟实现
我们画图来表示下
其实这个函数我们再前面以及模拟实现过了
设计两个指针 一个指向目的地 一个指向源字符串
然后将源字符串的值赋值给目的地 并且接着下一个字符 直到达到源目的地的\0为止
代码如下
char* my_strcpy(char* des, char* str) { assert(des && str); //断言 保证不是空指针 char* ret = *des; while (*des++=*str++) { ; } return ret; }
我们可以发现 代码是可以完美运行的