当前位置:网站首页>【C语言进阶】字符串和内存函数(二)
【C语言进阶】字符串和内存函数(二)
2022-06-29 09:36:00 【皓仔活在今天】
1、strtok函数
1、strtok会将字符串根据分隔符,分割成一个个标记,并将分割的标记中的分割符变成 ‘\0’,同时会返回一个指向这个标记的指针
2、注意:strtok函数会改变被操作的字符串,所以使用strtok函数的时候,一般都在零时拷贝的内容中使用
3、strtok函数找第一个标记的时候,函数第一个参数不是NULL,第一个标记的位置会被strtok函数保存
4、strtok函数找非第一个标记的时候,函数的第一个参数是NULL,会在第一个标记的保存位置接下去分割
5、当strtok函数已经找不到标记之后,会返回一个NULL
6、函数用法举例
2、strerror函数
1、返回错误码所对应的错误信息
3、字符分类函数
1、iscntrl函数:任何控制字符
2、isdigit:10进制数字0~9
3、isxdigit:十六进制数字,包含所有十进制数字,小写字母a~f,大写A ~F
4、isslower:判断是否是小写字母a~z
5、isspace:判断是否是空白字符:如果是就返回非零值,不是就返回0
6、isupper:判断是都是大写字母A~F
7、isalpha:判断是都是字母,无论大小写
8、isalnum:判断是否是字母或者数字
9、tolower:字符转换,把大写字母转换成小写
10、toupper:字符转换,把小写字母转换成大写
实际用例
4、内存函数
4.1、memcpy函数
1、不同于strcpy函数只能拷贝字符串,memcpy函数能拷贝内存中的所有类型
2、memcpy()的3个参数,第一个是目的地空间,第二个是来源空间,第三个参数是拷贝内容的字节数
3、实际用例
4、模拟实现memcpy函数
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)//num单位是字节
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;//强制类型转换的效果只在当前语句有效
//强制类型转换效果是临时的
dest = (char*)dest + 1;//所以不能直接dest++,而是写成这种形式
src = (char*)src + 1;//src同理
}
return ret;
}
int main()
{
int arr1[] = {
1,2,3,4,5,6,7,8,9,10 };
int arr2[5] = {
0 };
my_memcpy(arr2, arr1, 5 * sizeof(arr1[0]));
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
4.2、memmove函数
1、memmove和memcpy的用法基本相同,区别是,如果目的地空间和来源空间发生重叠,memmove任然可以正确复制,但是memcpy就无法正确复制(下附例子)
2、C语言要求:
memcpy能拷贝不重叠的内存空间就可以了
memmove去处理那些重叠内存拷贝
3、模拟实现memmove函数
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
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;
}
void test1()
{
int arr1[] = {
1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1 + 2, arr1, 5 * sizeof(arr1[0]));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
}
int main()
{
test1();
return 0;
}
4.3、memcmp函数
1、函数声明
int memcmp(const void *str1, const void *str2, size_t n)
2、返回值
str1<str2 <0
str1=str2 =0
str1>str2 >0
3、用例
//通过输入字节数n,比较前后两个数组从首地址开始的n个字节
#include<stdio.h>
#include<string.h>
int main() {
int arr1[5] = {
1,2,3,4,5 };
int arr2[5] = {
1,2,3,4,0x11223305 };
int ret = memcmp(arr1, arr2, 16);
printf("%d", ret);
return 0;
}
4.4、memset函数
1、memset函数是初始化函数,可以将一段连续的内存初始化为某个值。
2、memset是按字节为单位进行初始化的
3、memset函数进行初始化的时候不关心你要初始化的数组是什么类型,都是按照字节为单位进行初始化
边栏推荐
猜你喜欢

Reprint: five methods to determine whether an object has attributes

SQL Server 数据库的几种简单查询

BUUCTF RE-easyre

Hystrix fuse: Service fusing and service degradation

WinForm uses zxing to generate QR code

UserWarning: Usage of dash-separated ‘script-dir‘ will not be supported in future versions. 笔记

Dev使用过程中的基本操作

AQS之BlockingQueue源码解析

MySQL InnoDB data length limit per row

AQS之ReentrantLock源码解析
随机推荐
&和&&的区别
打印9*9乘法口诀表(C语言)
罗清启:高端家电已成红海?卡萨帝率先破局
《CLR via C#》读书笔记-单实例应用程序
Print leap years between 1000 and 2000 (C language)
UserWarning: Usage of dash-separated ‘script-dir‘ will not be supported in future versions. 笔记
Buuctf-- happy New Year
Analysis of reentrantlock source code of AQS
MySQL innodb每行数据长度的限制
If [not] exists in MySQL
WinForm uses zxing to generate QR code
The use and difference of watch listening and computed calculation attributes
With this tool, automatic identification and verification code is no longer a problem
产品力不输比亚迪,吉利帝豪L雷神Hi·X首月交付1万台
MySQL中update一条record的过程
Common usage of LINQ in C #
全面理解MESI缓存一致性协议
AGCTFb部分题解
arcgis创建postgre企业级数据库
Bug description, rating and life cycle