🎏本文导航
1. C语言字符库函数
1.1 字符串长度计算函数——strlen
介绍
size_t strlen( const char *string );
字符串已 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
注意:
- 传入的字符串一定要包含
\0
,不然可能会出现结果错误。 - 返回值为
size_t
,为无符号整型。
针对第2点的一个易错题:
int main()
{
const char* str1 = "wjhwef";
const char* str2 = "abc";
if (strlen(str2) - strlen(str1) > 0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}
大家可能会这么想,strlen(str2) = 3
, strlen(str1) = 6
,strlen(str2) - strlen(str1) = -3 < 0
,程序输出str1 > str2
,那我们来看看究竟是不是这样!
运行结果:
str2>str1
C:\Users\HP\Desktop\gitee\test\world\7-06-字符串函数\x64\Debug\7-06-字符串函数.exe (进程 20212)已退出,代码为 0。
按任意键关闭此窗口. . .
结果不对,程序输出的结果是str2>str1
,这是因为函数strlen
返回的类型是无符号整型,两个无符号整型进行加减运算还是无符号整型,而无符号整型的范围是大于0
的,所以程序会输出str2>str1
。
模拟实现
这个函数模拟很简单,根据\0
为结束标志,计算字符个数即可。
这里有三种实现方式:
- 计数实现
- 递归实现
- 指针 - 指针实现
//计数实现
size_t my_strlen1(const char* string)
{
size_t count = 0;
while (*string++ != '\0')
{
count++;
}
return count;
}
//递归实现
size_t my_strlen2(const char* string)
{
if (*string == '\0')
{
return 0;
}
else
{
return 1 + my_strlen2(string + 1);
}
}
//指针-指针实现
size_t my_strlen3(const char* string)
{
char* tmp = string;
while (*tmp != '\0')
{
tmp++;
}
return tmp - string;
}
int main()
{
char arr[] = "abcdefghijk";
printf("%u\n", my_strlen1(arr));
printf("%u\n", my_strlen2(arr));
printf("%u\n", my_strlen3(arr));
}
//打印结果:11
1.2 字符串拷贝函数——strcpy,strncpy
介绍
char *strcpy( char *strDestination, const char *strSource );
char *strncpy( char *strDest, const char *strSource, size_t count );
这两个函数都能实现字符串的拷贝,只不过strncpy
多了一个参数count
,用来控制拷贝字符串的个数,count
是多少字符串就拷贝多少,当然如果超过了源字符串的个数就会在源字符串拷贝完后直接补0
直到数量为count
个。
这两个函数都有两个字符指针,前者是是拷贝存放的地方(目标字符串),后者是需要被拷贝的字符串(源字符串)。
注意:
- 源字符串必须含有
\0
。 - 源字符串中的
\0
会被拷贝到目标字符串。 - 目标字符串空间要够大或可变。
int main()
{
char str1[] = "Hello World!";
char str2[100] = {
0 };
char str3[100] = {
0 };
strcpy(str2, str1);
strncpy(str3, str1, 5);
printf("%s\n", str2);
printf("%s\n", str3);
return 0;
}
Hello World!
Hello
C:\Users\HP\Desktop\gitee\test\world\7-3-字符串函数\x64\Debug\7-3-字符串函数.exe (进程 14244)已退出,代码为 0。
按任意键关闭此窗口. . .
模拟实现
strcpy
模拟实现思路:
利用结束标志\0
,对源字符串遍历,遍历一个就拷贝一个到目标字符串,直到遇到\0
,结束遍历,拷贝完成!
strncpy
模拟实现思路:
如果count
的值不大于源字符串的字符个数(包括\0
),则和strcpy
拷贝思路是一样的,但是count
大于源字符串个数,源字符串中字符拷贝完后,还得在目标字符串补0
。
char* my_strcpy(char* des, const char* str)
{
assert(des && str);
char* ret = des;
while (*des++ = *str++)
{
;
}
return ret;
}
char* my_strncpy(char* des, const char* str, size_t n)
{
assert(des && str);
char* ret = des;
while(n--)
{
//源字符串未到结尾
if (*str)