1.前言💬
因为学校期末考试,时隔十一天才着手写这篇博客,上一篇博客介绍了字符串相关函数的一部分及实现,本篇则介绍剩余的字符串函数以及内存函数等
2.字符串函数💬
2.1strtok👾
strtok是一个字符串分割的一个函数,通过设定的分割赋从而将一个字符串分割成不同的字符串。
其用法规则如上图所示,看起来比较拗口繁琐,接下来我用例子直接进行演示:
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = "kkk@kkkkk@qq.com.com";
const char *sep = "@.";
char str1[30];
//因为strtok会改变被操作的字符串,所以我进行临时拷贝
strcpy(str1, str);
//1.kkk
char* ch = strtok(str1, sep);
printf("%s\n", ch);
//2.kkkkk
ch = strtok(NULL, sep);
printf("%s\n", ch);
//3.qq
ch = strtok(NULL, sep);
printf("%s\n", ch);
//4.com
ch = strtok(NULL, sep);
printf("%s\n", ch);
//5.com
ch = strtok(NULL, sep);
printf("%s\n", ch);
}
调试结果如下:
调试结果如图所示,每找到一个标记后会将这个标记换成‘\0’,并保存这个标记位置,供下一次参数为NULL时查找其他分隔符。
改进:
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = "kkk@kkkkk@qq.com.com";
const char *sep = "@.";
char str1[30];
//因为strtok会改变被操作的字符串,所以我进行临时拷贝
strcpy(str1, str);
char* ch = NULL;
for (
ch = strtok(str1, sep);
ch != NULL;
ch = strtok(NULL, sep)
)
{
printf("%s\n", ch);
}
}
2.2strerror👾
是一个返回错误码,报告程序中错误信息的一个函数。
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
FILE* pf;
pf = fopen("test.txt", "r");
printf("%s", strerror(errno));
//errno需要引头文件#include<errno.h>
return 0;
}
结果如上,会使用即可!
3.内存操作函数💬
3.1memcmp👾
int main()
{
int arr1[] = { 1,2,3,4,5,7,7,7,10 };
int arr2[] = { 1,2,3,4,8,9,10,11,12 };
printf("整形数组比较:\n");
printf("%d\n", memcmp(arr1, arr2, 16));
printf("%d\n", memcmp(arr1, arr2, 28));
printf("字符串比较:\n");
char str1[] = "abcdefgh";
char str2[] = "abcdxxxx";
printf("%d\n", memcmp(str1, str2, 4));
printf("%d\n", memcmp(str1, str2, 6));
return 0;
}
3.2memcpy👾
memcpy是字节拷贝函数,同strcpy用法一致,参数意义与*memcmp大致一样,在此就不进行赘述了,接下来直接实现memcpy函数
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
char str1[30] = { 0 };
char str2[] = "abcdefg";
my_memcpy(str1, str2, 6);
printf("%s\n", str1);
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[] = { 8,8,8,8,8,8,8,8,8,8 };
my_memcpy(arr1, arr2, 40);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
如果我们这样调用函数呢?
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memcpy(arr1+2, arr1, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
3.3memmove👾
memmove就是用来处理赋值时地址重叠的问题的一个库函数,也是与strcpy的意义一致,用来复制数据,不过它处理的是空间重叠时的数据复制;具体测试在这就不进行演示了,可以参考memcpy的地址重叠进行测试用例!
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
//前->后
if (dest < src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
//后->前
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
char str[] = "abcdefxxxxx";
my_memmove(str, str + 6, 5);
printf(str);
return 0;
}
3.4memset👾
memset是一个初始化函数;value是初始化的数值,num是字节,该函数其实时对每一个字节进行初始化赋值。
int main()
{
char str1[10];
int arr1[10];
memset(str1, 0, 10);
memset(arr1, 0, 40);
return 0;
}
Ending💬
本次博客到这里就全部结束了,也就将字符串相关函数也就大概罗列完成,就这样吧🙋♂️🙋♂️