C语言处理字符串及内存操作
字符串处理函数
1.字符串长度 strlen表示包含的字符的个数,size_t strlen(char cosnt *string), 返回的是size_t类型,它是无符号整数类型,在表达式中进行运算时必须强制转换成整型int,因为无符号数不可能是负的,如strlen(x) - strlen(y) >=0;
2.不受限制的字符串函数,只是通过寻找字符串参数结尾的NUL字节来判断他的长度,必须保证不会溢出,strcpy和strcat返回第一个参数的拷贝,是一个指向目标字符数组的指针。
(1)复制字符串
char *strcpy(char *dst, char const *src),其中参数dst可以修改,因此它必须是字符数组或一个指向动态分配内存的数组指针,足够大,提前开辟,不能自动计算数组长度,不能是字符串常量。新字符串以NUL结尾,如果新字符串比较短,老字符串后面的几个字符也会被有效删除。
(2)连接字符串
char *strcat(char *dst, char const *src),其中dst和src的内存位置不能出现交叠,即dst和src为同一个定义的字符串,另外需要保证不会溢出。
(3)字符串比较
char *strcmp(char const *s1, char const *s2),如果s1小于s2,strcmp返回一个小于零的值,如果大于0,返回大于0的值,如果相等返回0
3.长度受限制的字符串函数
(1)char *strncpy(char *dst, char const *src, size_t len);显示接受一个长度参数,当src的字符串长度小于len,则dst用额外的NUL字节填充到len长度,如果src大于或等于len,dst的末尾不会以NUL结尾,因此考虑在函数后加一条语句:dst(sizeof(dst) - 1) = '\0';
(2)char *strncat(char *dst, char const *src, size_t len);总是在结果字符串后面添加一个NUL字节,不管dst的长度,最多往dst中复制len个字符,再加一个NUL字节。
1 char a[3] = "ab"; 2 char b[4] = "mnp"; 3 strncat(a, b, 3); 4 for (size_t i = 0; i < 10; i++) 5 printf("%c\n", a[i]);
总是在dst的末尾添加,不管dst的长度。
(3)char *strncmp(char const *s1, char const *s2, size_t len);函数的返回值只根据len个字节的比较来确定
4.字符串查找(重点)
(1)查找一个字符
char *strchr(char const *str, int ch);
char *strrchr(char const *str, int ch);
虽然第二个参数是整型值,但其实是一个字符值。分别返回ch在str中第一次出现和最后一次出现的位置,如果不存在则返回NULL指针。
1 #include <string.h> 2 #include <stdio.h> 3 int buld(char* str, char c) { 4 int p = strchr(str,c) - str; //??? 5 return p; 6 } 7 int main() { 8 char str1[20],c; 9 printf("输入字符串:\n"); 10 gets(str1); 11 char *p = str1; 12 printf("输入一个字符:"); 13 scanf("%c",&c); 14 printf("%s\n",strchr(str1,c));//打印字符串str1中从字符c开始的后续字符串, 15 //如果有字符串中有多个与c相同的字符,应该以第一个为准 16 int n = strchr(str1,c) - p; //??? 17 printf("%d", n); //输出c在str1中的字符串中的位置 18 }
(2)查找任何几个字符(标准库中不存在)
char *strpbrk(char const *str,char const *group);
并不是查找某个特定的字符,而是查找任何一组字符第一次在字符串中出现的位置。
(3)查找一个子串(标准库中不存在)
char *strstr(char const* s1, char const* s2)
若s2不为空,在s1中查找整个s2第一次出现的位置,否则返回NULL指针;若s2为空,则返回s1
(4)查找字符串前缀
size_t strspn(char const *str, char const *group);
size_t strcspn(char const *str, char const *group);
group字符串指定一个或多个字符。strspn从str起始位置开始,遍历所有字符,直到第一个不符合group字符串的字符为止,返回所有符合group的字符的数目. strcspn则相反,直到第一个符合的字符为止,返回不符合的字符数目。
(5)查找标记
char *strtok(cahr *str, char const *sep);
sep是个字符串,定义了多个分隔符的字符集合,strtok找到str的下一个标记,并将其用NUL结尾,然后返回一个指向这个标记的指针。
典型用法:第一次调用时,向它传递一个指向字符串的指针,然后这个函数被重复调用(第一个参数为NULL),直到返回NULL,将原字符串分段输出。
1 #include <stdio.h> 2 #include <string.h> 3 4 void print_tokens(char line[]){ 5 6 //static char whitespace[] = " \t\f\r\v\n"; 7 char *whitespace = " \t\f\r\v\n"; 8 char *token; 9 10 for (token = strtok(line, whitespace); 11 token != NULL; 12 token = strtok(NULL, whitespace)) 13 printf("Next token is %s\n", token); 14 } 15 16 int main(){ 17 18 char line[] = "int main\twosshi \f\f \r\v"; 19 20 print_tokens(line); 21 return 0; 22 }
5.内存操作(重点)
字符串都是以NUL字节结尾,所以字符串内部不能包含NUL字符,处理类似字符串时就不能够用常规字符串处理函数,另外内存操作还可以处理数组和结构体,但该函数的返回值和参数类型均为void*
(1)void *memcpy(void *dst, void const *src, size_t length);
显式包含需要处理的字节数,但和strn的函数不同,遇到NUL并不会停止操作,可以复制任何类型的值,第三个参数指定复制长度(以字节计算)。
若是字符数组:char a[n], b[n],则memcpy(a, b, n);表示从b数组复制n个字节到a,但如果是a和b是整型数组,则memcpy(a, b, sizeof(b));
另外如果只有部分内容需要复制,则需要复制的数量需要在第三个参数中指明,对于长度大于一个字节的数据,需要数量和数据类型的长度相乘;memcpy(a, b, count*sizeof(b));
(2)void *memmove(void *dst, void const *src, size_t length);主要用于源和目标参数存在重叠的情况
(3)void *memcmp(void const*a, void const *b, size_t length);只能比较单字节的数据,一共比较length个字节,函数的返回值只根据length来确定
(4)void *memchr(void const*a, int ch, size_t length);从a开始的位置开始查找ch出现的第一次的位置,并返回一个指向该位置的指针,一共length个字节
(5)void *memset(void const*a, int ch, size_t length);从a开始的length个字节都设置为字符值ch。
注意:memset最大的作用是将a的前length个字节置为0,a可以是指针,也可以是数组。另外,由于计算机中的字节为16进制,因此不能将memset中重置为1,否则会出错。
转载于:https://www.cnblogs.com/qinguoyi/p/10130429.html
C语言处理字符串及内存操作相关推荐
- C语言程序设计 | 模拟实现内存操作函数:strncpy, strncat, strncmp, memcpy, memmove
模拟实现字符串和内存操作函数(二)目录: strncpy strncat strncmp strcmp memcpy memmove strncpy char* strncpy(char* dst, ...
- 使用C语言实现字符串逆序操作
这篇文章主要介绍了使用C语言实现字符串逆序操作案例,本文包含使用C语言的两种方法去实现,递归和非递归,以下就是详细内容,需要的朋友可以参考下 编写一个函数 reverse_string(char * ...
- C语言——常见的字符串函数+内存操作函数的介绍及实现
文章目录 前言 一.字符串函数 1.求字符串长度 strlen 2.长度不受限制的字符串函数strcpy.strcat.strcmp 字符串拷贝 strcpy 字符串追加拷贝 strcat 字符串比较 ...
- 字符串以及内存操作相关函数
字符串拷贝和内存拷贝函数: strcpy strncpy memcpy memmove memccpy bcopy 字符串和内存数据比较函数: strcmp strcasecmp strncasecm ...
- c语言:字符串和内存函数介绍
字符串和内存函数: 目录 1.strlen(包含于头文件string.h) 2.strcpy(包含于头文件string.h) 3. strcat(包含于头文件string.h) 4.strcmp(包含 ...
- c语言字符指针清零,C语言中字符串的内存地址操作的相关函数简介
C语言bcopy()函数:复制内存(字符串)头文件: #include bcopy() 函数用来复制内存(字符串),其原型为: void bcopy(const void *src, void *de ...
- 【C语言】字符串和内存函数详解
文章目录 1. 求字符串长度 strlen
- 【C语言】字符串和内存函数介绍及模拟实现
- 字符串转内存c语言,【一起学C】C语言面试题必考:字符串操作函数,内存操作函数实现...
本帖最后由 奉聪 于 2017-1-25 14:54 编辑 *******前言******* 我数一下,我发了几个帖子,1.2.3? 哈哈哈,没几个哈,感谢吾爱,让我学到了很多,乐于分享,共同进步! ...
最新文章
- 可持久化Trie +枚举 ---- P5795 [THUSC2015]异或运算
- 二、Zabbix 服务端部署安装
- GPG key retrieval failed: [Errno 14]
- MyBatis整合Spring原理分析
- 怎么样才显示暗=安装好了mysql_linux mysql安装
- 【网络基础】《TCP/IP详解》学习笔记4
- chrome无法拖拽离线安装CRX格式插件解决方法
- 跳转到系统挑选铃声的页面
- dao和mysql映射_hibernate通过数据库生成实体类,映射文件和DAO(实用)
- Python中logging日志使用
- android VideoPlayer原生播放方式
- android内存卡测试,安卓sd卡真假检测工具_内存卡检测扩容卡软件_sd insight
- 医药网订单对接ERP软件订单接口
- 微型计算机原理与接口技术马静答案,微机原理与接口技术(马静)
- 浏览器无法上网,其他软件可以
- java实现图片的压缩且保留图片尺寸不变
- pandas不显示index_大熊猫 - 不在索引中(pandas - not in index)
- gnuplot下载及基本使用
- 中专计算机毕业生登记表自我鉴定,中专毕业生登记表自我鉴定范文(精选5篇)...
- Mophie vs RavPower vs Belkin: 哪家无线充电板最强?丨Xtecher 评测
热门文章
- android获取软件大小,android获取屏幕大小包括状态栏和软件导航栏的大小
- 在世界第二届半机械人奥运会上,瘫痪飞行员在Cybathlon BCI竞赛中争夺金牌
- Gameplay 框架
- 复旦教授发现400+安卓漏洞,最严重可使手机变砖,谷“鸽”16个月后才修复
- 40千克的镜子被量子力学“踢了一脚”,科学家首次发现宏观物体量子波动 | Nature...
- 李开复:AI行业正在回归商业本质,技术公司要有服务心态落地为王 | MEET2020
- 前SAP全球VP加盟第四范式任总裁,戴文渊:加速多行业规模化扩展
- redis单机版安装
- Java并发编程:线程池
- (十六) 整合spring cloud云架构 -使用spring cloud Bus刷新配置