1.Strlen
作用:返回字符串中“\0”前面出现的字符个数,不包括“\0”。
想了解一个函数的用法,最简单的方式就是进入cplusplus的网站搜索,这里我把网站放在下面,方便大家查看。
strlen - C++ Reference (cplusplus.com)
使用方法:
#include<stdio.h>
int main()
{
char arr[] = "abcdefg";
printf("%d", strlen(arr));
//只需要把要求的数组名放进strlen后面的括号里面就行
return 0;
}
运行效果:
模拟实现Strlen:
为了更深刻的理解strlen,接下来我们来模拟实现它。
方法一:计数器方式
#include<stdio.h>
size_t my_strlen(const char* str)
//3.函数的参数和Strlen一样
{
int count = 0;
//4.定义一个计数器
while (*str != '\0')
//5.如果str指向的位置不是\0,就进入循环,这里我们省略掉,因为当str=0时就为假,就会跳出循环
{
str++;
//6.str向后走一步
count++;
//7.计数器+1
}
return count;
//跳出循环时,返回计数器
}
int main()
{
char arr[] = "helloword";
//1.定义一个数组
int ret = my_strlen(arr);
//2.定义一个函数,把它返回的数据用ret接收
printf("%d", ret);
return 0;
}
方法二:递归方式
#include<stdio.h>
size_t my_strlen(const char* str)
//3.函数的参数和Strlen一样
{
if (*str == '\0')
//4.如果str等于0
return 0;
//5.直接返回0
else
return 1 + my_strlen(str + 1);
//6.这里返回的是1加上后面字符串的大小,就是整个字符串的大小
}
int main()
{
char arr[] = "helloword";
//1.定义一个数组
int ret = my_strlen(arr);
//2.定义一个函数,把它返回的数据用ret接收
printf("%d", ret);
return 0;
3.指针减指针的方法
#include<stdio.h>
size_t my_strlen(const char* str)
//3.函数的参数和Strlen一样
{
int s = str;
//4.定义一个变量存放数组首元素的位置
while (*str)
//5.如果不等于0,就进入循环
{
str++;
//6.str向后走一步
}
return str - s;
//7.指针—指针,得到的是两个指针之间元素的个数
}
int main()
{
char arr[] = "helloword";
//1.定义一个数组
int ret = my_strlen(arr);
//2.定义一个函数,把它返回的数据用ret接收
printf("%d", ret);
return 0;
}
注意事项:
- 参数指向的字符串必须要以 '\0' 结束。
- 注意函数的返回值为size_t,是无符号的( 易错 )
- 学会strlen函数的模拟实现
2.Strcmp
作用:比较两个字符串里面对应元素的大小
strcmp - C++ Reference (cplusplus.com)
使用方法:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcd";
char arr2[] = "abcc";
int ret = strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}
strcmp函数比较方式是一对一对的,先同时比较两个字符串下标为0的数据,如果他们是相等的,则再同时比较下标为1的数据,以此类推,直到遇到“\0”,比较的方式是ASCII码值。
如果arr1>arr2,则返回一个大于0的数字
arr1=arr2,则返回0
arr1<arr2,则返回一个小于0的数字
在vs的环境中,大于返回1,等于返回0,小于返回-1。
运行效果:
模拟实现Strcmp:
#include<stdio.h>
#include<assert.h>
//assert的头文件
int my_strcmp(const char* str1, const char* str2)
//3.函数的参数strcmp一样
{
assert(str1 && str2);
//4.断言一下,确保不是为空
while (*str1 == *str2)
//5.拿出str1的首元素和str2的首元素对比一下,是相等的话进入循环
{
if (str1 == '\0')
//6.如果str1等于\0,就返回0,因为str1等于\0,str2也等于\0
return 0;
str1++;
//7.str1向后走一位
str2++;
//8.str2向后走一位
}
if (*str1 > *str2)
return 1;
//9.如果大于,返回1
else
return -1;
//10.如果小于,返回-1
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abcc";
//1.定义两个字符串
int ret = my_strcmp(arr1, arr2);
//2.定义函数,函数的返回值放到ret里面
printf("%d", ret);
return 0;
}
3.Strcpy
作用:拷贝字符串到另外一个字符串
strcpy - C++ Reference (cplusplus.com)
使用方法和运行效果:
如图所示,strcpy成功的把arr2里的字符串拷贝到了arr1里面,包括\0,实际上原理很简单,就是一直向后走,直到遇到\0就停止。
模拟实现 Strcpy:
#include<stdio.h>
#include<string.h>
char* my_strcpy(char* des, char* son)
//3.函数的参数和strcpy一样
{
char* ret = des;
//4.把des的存到ret里面
while (*des++ = *son++)
//5.把des的值赋值到son里面,如果des=\0,则两边同时为假,就会跳出循环
{
;
}
return ret;
//6.改完之后返回ret
}
int main()
{
char arr1[20] = "XXXXXXXXXX";
char arr2[] = "ABCD";
//1.创建两个数组
my_strcpy(arr1, arr2);
//2.创建一个函数,arr1是目的地,arr2是来源
return 0;
}
注意事项:
- 源字符串必须以'\0'结束
- 会将源字符串中的 '\0' 拷贝到目标空间
- 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须可变
- 学会模拟实现
4.Strcat
作用:在目标字符串后面追加另一个字符串
strcat - C++ Reference (cplusplus.com)
使用方法和运行效果:
如图所示,strcat函数,成功的在字符串arr1后面追加了arr2,他的原理是先找到目的地数组里面的\0,再把arr2拷贝过去,它会把arr1字符串后面的\0替换掉,再把追加成功后的字符串末尾添加一个\0。
模拟实现:
#include<stdio.h>
#include<string.h>
#include<assert.h>
//assert的头文件
char* my_strcat(char* dest, char* sour)
{
assert(dest && sour);
//3.断言
char* ret = dest;
//4.把dest存到ret里面
while (*dest != '\0')
//5.如果dest不等于\0,进入循环
{
dest++;
}
while (*dest++ = *sour++)
//6.然后挨个赋值,直到遇到\0
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello";
char arr2[] = "word";
//1.创建两个字符串
char *str = my_strcat(arr1, arr2);
//2.创建一个函数
printf("%s", str);
return 0;
}
注意事项:
- 源字符串必须以 '\0' 结束
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
- 字符串如果给自己追加,会出错,原因就是\0被替换掉了,就找不到\0了
上面的这些函数我们叫它长度不受限字符串函数,因为它在是使用的过程中没有指定要拷贝多少个,追加多少个,它们只会找到\0,然后再向后执行。
5.Strncmp
作作用:这里我们看到函数的参数和strcmp几乎差不多,只多了一个num,它的意思是比较多少个字符串
strncmp - C++ Reference (cplusplus.com)
使用方法和运行效果:
这里我们看到arr1的前两个字符和arr2的前两个字符是相同的,所以返回的是0;
6.Strncpy
作用:这它的意思就是要拷贝几个字符串。
strncpy - C++ Reference (cplusplus.com)
使用方法和运行效果:
这里我们看到在arr1后面之追加了两个字符。
7.Strncat
作用:它的意思是要在后面追加几个字符串。
strncat - C++ Reference (cplusplus.com)
使用方法和运行效果:
这里我们看到arr1字符串后面,之追加了两个字符。
以上三个函数,是长度受限字符串函数,我们可以控制它需要拷贝,追加多少个字符。
8.Strstr
作用:在一个字符串里面查找一个字符串,如果找到了,返回首地址,找不到的话返回空指针。
strstr - C++ Reference (cplusplus.com)
使用方法和运行效果:
这里我们看到,当arr1里面有arr2时,返回的是b的起始地址,连后面的字符也打印出来了。
9.Strtok
strtok - C++ Reference (cplusplus.com)
使用方法和注意事项:
- sep参数是个字符串,定义了用作分隔符的字符集合
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。
- strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
- strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
- strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
10.Memcpy
作用:内存拷贝
memcpy - C++ Reference (cplusplus.com)
使用方法和运行效果:
注意事项:
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
11.Memmove
作用:内存拷贝
使用方法和运行效果:
注意事项:
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
12.Memset
作用:以字节为单位来设置内存中的数据
memset - C++ Reference (cplusplus.com)
使用方法和运行效果: