写在前面:本文来介绍4个有趣的字符串和3基本的内存函数,以及部分内存函数的模拟实现
目录
一,字符函数
1.strstr
- 通俗理解:就是寻找子串的函数。
到其结果是在一个字符串里寻找指定的子串首地址,并返回首地址,内容即是从首地址到‘\0’。 若找不到就返回(null)
来看看它的函数形式
即:strstr(【查询的字符串地址】,【被查询的字符串地址】)
2.strtok
- 通俗理解:找到特定标号,分隔字符串
其运行大致过程是将给定标号更改为‘\0’,每用一次该函数改一个特定标号为‘\0’。
来看看它的函数形式
由此我们得知,想要切割一个大于两个标识符的字符串,要多次运用strtok函数来分割
形式:用一次strtok(str,"【标识符】"),后面的strtok(NULL,"【标识符】")
ps:该函数会改动原有的字符串内容,所以一般我们会拷贝一份新字符串来运用,以免丢失原字符串的内容。
3.strerror
- 通俗理解:该函数将全局变量error进行赋值,然后会根据error对应的值在控制台显示报错原因。
来看看它的函数形式
4.perror
- 通俗理解:就是直接打印errno对应值的错误信息。
来看看它的函数形式
我们将perror()和strerror()对比学习,如下图:
ps:值得注意的是,如果只想用perror()错误信息,而不想输出其他的,可以传空字符串("")过去
二,内存函数
1.memcpy(模拟实现)
- 通俗理解:无论什么形式的参数,都可以拷贝内容
该函数的实现是找到储存数据的地址,然后在解引用原地址和目的地址将其的内容进行赋值操作,达到拷贝目的。因为获取到的是地址,所以该函数能适用于任意类型的值。
形式:memcpy(【目的地址】,【原地址】,要拷贝的字节大小)
模拟实现代码:
char* my_memcpy(void* destination, void* source, int size)
{
char* temp = destination;
while (size--)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
return temp;
}
2.memmove(模拟实现)
- 通俗理解:功能和memcpy基本一样,只是实现代码不一样 (具体对比模拟实现代码)
模拟实现代码:
char* my_memmove(void* destination, void* source, int size)
{
char* temp = destination;
if (destination < source)
{
while (size--)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
}
else
{
while (size--)
{
* ((char*)destination+size) = *((char*)source+size);
}
}
return temp;
}
3.memcmp
- 通俗理解:和strcmp函数十分相似,只不过是它的升级版,什么都类型的都可以比较,且能指定长度来比较。
该函数的实现是找到储存数据的地址,然后解引用地址,一个数据一个数据进行比较,若前面数据相同,则长度更长的更大