文章目录
前言
C语言内置了相当多的函数供用户使用,这些函数被集成封装在标准库里,用户只需要调用即可完成相应特定的功能,这些函数称为库函数。
下面是百度百科中给出的相关定义:
库函数一般是指编译器提供的可在C源程序中调用的函数。由于版权原因,库函数的源代码一般是不可见的,但在头文件中你可以看到它对外的接口。
------百度百科
本文的主要内容是向读者介绍常用的与字符串和内存相关的系列库函数的使用及其功能的自实现,使读者对库函数的内部实现机理有较深入的了解。
与字符串有关的库函数
库函数strlen
strlen函数是一个用来计算一个字符串的长度(单位是字节)的。以下是C和C++官网给出的相关函数信息:
strlen函数的使用
下面通过一个小案例来调用该函数。
从运行的结果可以看出,该库函数计算的字符串长度是6个字节,也就是abcdef这6个字符所占的大小。下面再看一个例子,与其进行对比:
这次的结果令人感到震惊,这个16是怎么来的?这个数组就只放了6个字符啊。该函数的使用应注意以下几点:
-
strlen计算字符串的长度,返回该字符串的长度;
-
实际参数必须是首元素的地址,以指针接收;
-
指针从前往后遍历,直到找到\0为止,计算出字符串的大小。
由以上分析,结合案例,我们发现案例2中的数组没有\0,也就是说计算的结果是随机值,返回值是没有参考意义的。
strlen函数的模拟实现
通过前面的使用和分析,我们可以自己编写代码来模拟实现strlen函数的基本功能。
#include <stdio.h>
size_t my_strlen(char* str)
{
size_t count = 0; //该变量用来统计字符个数
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdefg";
int r = my_strlen(arr);
printf("字符串arr的长度为:%u\n", r);
return 0;
}
下图是其实现细节:
从首元素地址处开始,如果其内容不是字符\0,记数器的值自增1,指针向后移动1个字节,直到指针指向地址处保存的值是\0结束循环,当前计数器的值就代表了字符串的总长度。
库函数strcpy
strcpy是一个实现字符串拷贝功能的库函数。以下是C和C++官网给出的信息:
strcpy函数的使用
下面通过一个小案例来调用该函数。
从调用该函数的结果来看,arr1的内容发生了变化,其值变成了arr2的内容。下面是该函数的一些特点:
- strcpy函数的功能是将源字符串拷贝到目标字符串;
- 源字符串的结束标志\0也会被拷贝到目标字符串中;
- 拷贝完成后,目标字符串的长度会发生改变,等于源字符串长度;
- 目标字符串的空间应该足够大。
strcpy函数的模拟实现
通过前面的使用和分析,我们可以自己编写代码来模拟实现strcpy函数的基本功能。
#include <stdio.h>
char* my_strcpy(char* dest, char* src)
{
char* ret = dest; //记录目标字符串的起始地址
while (*dest++ = *src++)
{
; //将源字符串内容拷贝到目标字符串中
}
return ret;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "ijk";
printf("拷贝前: %s", arr1);
my_strcpy(arr1, arr2);
printf("\n拷贝后: %s", arr1);
return 0;
}
下图是其实现细节:
dest指针指向目标字符串的起始位置,src指针指向源字符串的起始位置,每拷贝完1个字符后指针都后移1字节。将源字符串中所有内容拷贝到目标字符串中,当\0拷贝完后,结束整个拷贝过程。
库函数strcmp
strcpy是一个实现字符串比较功能的库函数。以下是C和C++官网给出的信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Dp2wraL-1632012230846)(D:\typo