👦个人主页:@Weraphael
✍🏻作者简介:目前是C语言学习者
✈️专栏:C语言航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关
前言
- 以下所以库函数的查阅都在cplusplus网站
- 以下字符串函数在使用前都要加上
#include <string.h>
一、strlen
1.1 strlen函数介绍
功能:计算的是字符串中
'\0'
前面出现的字符个数(不包含'\0'
)
【文档描述】
1.2 strlen函数用法
1.3 strlen函数的注意事项
- 参数指向的字符串必须要以
'\0'
结束,如果不以'\0'
结束,求出的长度时随机值- 注意函数的返回值是
size_t
,是无符号的;因为字符串的长度不可能为负数
1.4 strlen函数的模拟实现(三种)
1.4.1 计数法
1.4.2 递归法
详细解析请参考:点我跳转
1.4.3 指针 - 指针
详情解析请参考:点我跳转
二、strcpy
2.1 strcpy函数介绍
功能:字符串拷贝
【文档描述】
2.2 strcpy函数用法
2.3 strcpy函数的注意事项
- 源字符串必须以
‘\0’
结束- 目标空间必须足够大,以确保能放下源字符串
- 目标空间必须可修改,不能用
const
修饰
2.4 strcpy函数的模拟实现
往期博客:点击跳转
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* scr)
{
// 判断指针的有效性
assert(dest && scr);
char* res = dest;
while (*scr != '\0')
{
// 赋值
*dest = *scr;
dest++;
scr++;
}
// ‘\0’的拷贝
*dest = *scr;
// 返回目标空间的起始地址
return res;
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxxx";
char arr2[] = "hello world";;
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
三、strcat
3.1 strcat函数介绍
功能:在字符串后追加字符串
【文档描述】
3.2 strcat函数用法
3.3 strcat函数的注意事项
- 源字符串必须以
‘\0’
结束- 目标空间必须要以
'\0'
结束- 目标空间必须足够大,能容纳源字符串的内容
- 保证目标空间可修改,不能加
const
修饰strcat
不能自己给自己追加
【解释】
字符串追加是从目标空间的'\0'
开始追加的,追加时会把'\0'
覆盖掉,这样字符串就没有结束标志,导致覆盖'\0'
后,源字符串没有以‘\0’
结尾,导致死循环
3.4 strcat函数的模拟实现
注意:
strcat
的追加是从目标空间的'\0
处开始追加的。
- 先要找到目标空间的
'\0'
- 从目标空间的
'\0'
处开始追加(赋值操作)
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* scr)
{
assert(dest && scr);
char* res = dest;
// 1. 找到目标空间的`\0`
while (*dest != '\0')
{
dest++;
}
// 2.在目标空间的'\0'处开始追加
while (*scr != '\0')
{
*dest = *scr;
dest++;
scr++;
}
// 拷贝'\0'
*dest = *scr;
return res;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
四、strcmp
4.1 strcmp函数介绍
功能:比较字符串大小(字典序)
【文档描述】
4.2 strcmp函数用法
4.3 strcmp函数的模拟实现
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
// 当str1和str2所指向为'\0'
// 说明两个字符串相同
if (*str1 == '\0')
{
// 相同返回0
return 0;
}
str1++;
str2++;
}
// 当str1和str2其中一个不相同来到此处
return *str1 - *str2;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abcc";
int res = my_strcmp(arr1, arr2);
if (res > 0)
{
printf("arr1 > arr2\n");
}
else if (res < 0)
{
printf("arr1 < arr2\n");
}
else
{
printf("arr1 == arr2\n");
}
return 0;
}
五、strncpy
5.1 strncpy函数介绍
strncpy
与strcpy
的功能相同,都是拷贝字符串- 不同的是:
strncpy
可以控制拷贝字符串的个数(注意:'\0'
也算个数)
【文档描述】
5.2 strncpy函数用法
5.3 strncpy函数的注意事项
- 因为受拷贝长度限制,
strncpy
不会拷贝源字符串的'\0'
(看用法),如果想拷贝'\0'
,需要算上'\0'
的个数。而strcpy
会自动拷贝源字符的'\0'
- 如果源字符串的长度小于
num
,则拷贝完源字符串之后,它会在目标空间后面自动追加'\0'
,直到num
个
5.4 strncpy函数的模拟实现
#include <assert.h>
#include <stdio.h>
char* my_strncpy(char* dest, const char* scr, int n)
{
assert(dest && scr);
char* res = dest;
while (n && *scr != '\0')
{
*dest = *scr;
scr++;
dest++;
n--;
}
return res;
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxxxxx";
char arr2[] = "hello";
my_strncpy(arr1, arr2, 3);
printf("%s\n", arr1);
return 0;
}
六、strncat
6.1 strnact函数介绍
strncat
与strcat
的功能相同,都是字符串追加- 不同的是:
strncat
可以=控制追加的长度
【文档描述】
6.2 strncat函数用法
6.3 strncat函数的注意事项
strncat
在目标字符数组追加完之后会自动补\0'
,所以它可以自己追加自己
6.4 strncat函数的模拟实现
#include <stdio.h>
#include <assert.h>
char* my_strncat(char* dest, const char* scr, int n)
{
assert(dest && scr);
char* res = dest;
// 1. 找到目标空间的'0'
while (*dest != '\0')
{
dest++;
}
// 2. 开始追加
while (n && *scr != '\0')
{
*dest = *scr;
dest++;
scr++;
n--;
}
//3.因为追加完之后会自动补\0
*dest = '\0';
return res;
}
int main()
{
char arr1[20] = "hello ";
my_strncat(arr1, "world", 3);
printf("%s\n", arr1);
return 0;
}
七、strncmp
7.1 strncmp函数介绍
- 与
strcmp
的功能相同,都是字符串比较- 不同的是:
strncmp
可以控制字符串比较的长度
7.2 strncmp函数用法
7.3 strncmp函数的模拟实现
#include <assert.h>
#include <stdio.h>
int my_strncmy(const char* str1, const char* str2, int n)
{
assert(str1 && str2);
while (n && *str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
n--;
}
return *str1 - *str2;
}
int main()
{
int input = 0;
char arr1[] = "abcd";
char arr2[] = "abcc";
printf("请输入要比较字符的长度:");
scanf("%d", &input);
int res = my_strncmy(arr1, arr2, input);
if (res == 0)
{
printf("前%d个字符相等\n", input);
}
else
{
printf("前%d个字符不相等\n", input);
}
return 0;
}
八、strstr
8.1 strstr函数介绍
功能:从str1中找str2(找子串)
【文档描述】
8.2 strstr函数用法
8.3 strstr函数的模拟实现
【分析】
情况1:
情况2:
【代码实现】
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
// 可能存在str2为空字符串
// 直接返回str1的地址
if (*str2 == '\0')
{
return str1;
}
//用s1和s2代替str1和str2来遍历
const char* s1 = str1;
const char* s2 = str2;
//p记录str1的位置,用来返回找到的起始地址
const char* p = str1;
while (*p)
{
s1 = p;
s2 = str2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
//*s2=\0,说明找到子串了
if (*s2 == '\0')
{
return p;
}
//循环中s1和s2不相等,让p++找下一个位置
p++;
}
//当*p = ‘\0’,说明p遍历完整个数组都没找到子串
return NULL;
}
int main()
{
char arr1[] = "abbbbcdef";
char arr2[] = "\0";
char* res = my_strstr(arr1, arr2);//从arr1中找arr2
if (res == NULL)
{
printf("找不到\n");
}
else
{
printf("找到了:%s\n", res);
}
return 0;
}
九、strtok
9.1 strtok函数介绍及用法
功能:分割字符串
【文档描述】
【解析】
- 如上图,
delimiters
参数是一个字符串,它是分割符的字符集合str
是被切割的字符串,不能用const
修饰- 函数返回类型是
char*
strto
k的作用:
strtok
找到str
中的分割符,并把分割符变成\0
,再返回一个指向这个标记的起始地址
- ①
strtok
函数的第一个参数不为NULL
,函数将找到str
中第一个标记,strtok
函数将保存它在字符串中的位置。
②strtok
函数的第一个参数为NULL
,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
【完整版】
十、strerror
10.1 strerror函数介绍
功能:返回错误码所对应的错误信息
- C语言的库函数在运行的时候,如果发生错误,就会将错误码存在一个全局变量,这个变量是errno
这些错误码通常是一些数字:1,2,3,4,5…
【文档描述】
10.2 strerror的用途
- fopen函数简介
【用法实现】
10.3 类似函数perror
功能:直接打印错误信息,在打印错误信息前,会先打印自定义的信息
【用法展现】