当前位置: 首页 > news >正文

【C语言】字符分类函数+内存函数

目录

1.字符函数

1.1字符分类函数

1.2.字符转换函数 

//统一字符串中的大小写

2.内存处理函数

2.1内存拷贝函数memcpy

//模拟实现memcpy

2.2内存移动函数memmove

//模拟实现memmove

2.3内存比较函数memcmp

2.4内存设置函数memset


1.字符函数

1.1字符分类函数

头文件:#include<ctype.h>

函数参数符合下列条件返回真(正数),否则返回假(0)
iscntrl任何控制字符
isspace空白字符:'  ',' \f' ,' \n ',' \t ',' \r ',' \v '
isdigit十进制数字:0~9
isxdigit十六进制数字:0~9,a~f,A~F
islower小写字母:a~z
isupper大写字母:A~Z
isalpha字母:a~z,A~Z
isalnum字母或数字:0~9,a~z,A~Z
ispunct标点符号:即任何不属于数字或字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符:包括图形字符和空白字符

1.2.字符转换函数 

头文件:#include<ctype.h>

大写转小写:tolower;  小写转大写:toupper

for example: 

//统一字符串中的大小写

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<ctype.h>int main()
{char arr[] = "i HavE aN ApPle";int i = 0;while (arr[i]){if (isupper(arr[i])){printf("%c", tolower(arr[i]));}else{printf("%c", arr[i]);}i++;}return 0;
}

 

2.内存处理函数

2.1内存拷贝函数memcpy

格式:void * memcpy ( void * destination, const void * source, size_t num );

功能:从源头 sour 拷贝 num 个字节到目的地 dest 中去。

实现memcpy功能的代码段:

 

//模拟实现memcpy

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)//void* 要返回指针
{assert(dest && src);void* ret = dest;while (num--){*(char*)dest = *(char*)src;//一个字节一个字节地拷贝dest = (char*)dest + 1;//不能写成(char*)dest++,这只是临时拷贝src = (char*)src + 1;//但是可以写成++(char*)dest}return ret;
}
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };my_memcpy(arr2, arr1 + 2, 20);return 0;
}

很好用是不是?但是当重叠内存拷贝时,my_memcpy的弊端就出现了(见下图),但是memcpy可以(至少在VS编译器的库里面和memmove差不多)。我们预想的是1 2 1 2 3 4 5 8 9 10,结果却是1 2 1 2 1 2 1 8 9 10,这时就需要memmove出马了~

 

2.2内存移动函数memmove

格式:void * memmove ( void * destination, const void * source, size_t num );

功能:从源头 sour 拷贝 num 个字节到目的地 dest 中去。

实现memmove功能的代码段:

//模拟实现memmove

#define _CRT_SECURE_NO_WARNINGS
#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);}}
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr + 2, arr, 20);return 0;
}

2.3内存比较函数memcmp

格式:int memcmp ( const void * ptr1, const void * ptr2, size_t num );

功能:比较 dest 和 src 中 num 个字节,返回整数(正/负/0)。

实现memmove功能的代码段:

2.4内存设置函数memset

格式:void * memset ( void * ptr, int value, size_t num );

功能:填充内存块。

ptr:指向要填充的内存块的指针;value:要填充的值;num:要填充几个字节

 实现memmove功能的代码段:

注意:函数要用在正确的地方,如果想用此函数将 arr 数组中的0全部改成0是不行的(char arr[10]={0}; memset(arr,1,40))memset:臣妾做不到啊~~。因为这会将每个字节都改成1,即:0x00 00 00 00 --> 0x 01 01 01 01,这根本不是1,所以要“量力而行”哦。


最近有点懈怠了呀,清醒清醒清醒!!!

http://www.lryc.cn/news/18396.html

相关文章:

  • 高通平台开发系列讲解(SIM卡篇)SIM卡基础概念
  • 记录一次ubuntu下配置ssh登录出现的问题
  • 深度剖析数据在内存中的存储(下)(适合初学者)
  • 智慧物联网系统源码:一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台
  • 2023年,拥有软考证书在这些地区可以领取福利补贴
  • 使用Unity在材质球上实现绘画:详细解释每一行Shader代码!
  • Tesseract 4.0训练字库并且识别训练后的图片
  • ChatGPT热潮背后,金融行业大模型应用路在何方?——金融行业大模型应用探索
  • 【怎么预防sql注入,以及还有预防其他的什么网络攻击】
  • 2023年全国最新机动车签字授权人精选真题及答案4
  • 【Java】用记事本实现“HelloWorld”输出
  • 我希望早点知道的关于成长的建议
  • 【哈希表】使用方法总结
  • 【笑小枫-面试篇】Java基础面试题整理,努力做全网最全
  • 亚马逊短期疲软,但长期前景乐观
  • webgis高德地图
  • django项目实战十(django+bootstrap实现增删改查)进阶数据统计
  • 【布隆过滤器(Bloom Filter)基本概念与原理、Bloom Filter优点与缺点、以及应用场景】
  • unity的Rendertexture上面显示粒子特效最便捷的解决方案
  • Docker 查询、停止、删除和重启容器
  • 面试历程(3)
  • 【storybook】你需要一款能在独立环境下开发组件并生成可视化控件文档的框架吗?(二)
  • (免费分享)基于ssm的BBS社区论坛系统带论文
  • RebbitMQ 消息队列(简单使用)
  • OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)
  • CRM系统能帮外贸行业解决哪些问题
  • 掌握lombok简化Java编码完成后端提效
  • 【蓝桥集训】第七天——并查集
  • 该来的总会来,继岳云鹏走红之后,孔云龙也和主流相声界打成一片
  • 索引的创建与设计原则