C字符串
C字符串
C中的字符串是以空字符('\0')结尾的一个char数组,基本的实现字符串的方法有:字符串常量,字符串数组,char数组,char指针。字符串使用广泛,如与用户交互等处理自然语言的情况。C为其提供的许多函数主要包含在string.h(各种处理函数)和stdio.h(面向字符串的输入输出函数)。
一、字符串的实现
1.字符串常量
字符串常量(又称字符串文字),是指位于一对双引号中的任何字符,编译器会自动在其结尾添加'\0'作为结束标志。字符串常量属于静态存储类,即使多次调用这个常量它在内存中也只存储一份(当然,再用字符串常量初始化char数组时它被复制了,这时副本已经不是字符串常量了)。字符串常量做参数时形参通常声明为const char *。
2.char数组与char指针
(1)在使用char数组时需要有足够大的空间来存储字符串。在对char数组进行初始化的情况下可以不指定长度而由编译器决定(最小长度,字符数加一个'\0')。
(2)char数组初始化有两种方式,可以用一个字符串常量,也可以像数值数组一样用花括号包含初始化表列,未被初始化的元素被自动置为'\0'【char [] = “example”;】。
(3)在使用初始化表列且未指定数组长度时,一定要在结尾加上'\0',否则这只是一个字符数组而非字符串。和其它数组一样char数组是一个指向一段连续空间首地址的指针常量。
(4)char指针指向一个字符串的首地址(通常是字符串常量也可以是一个char数组)。对char数组赋值必须逐个元素赋值,对char指针赋值只需要复制地址即可。
//例 char *ch;//声明一个指针ch ch = (char *)malloc(sizeof(char));//ch指向一个char类型的数组
(5)char指针可以进行加减,自增(减),取值运算也可以像数组一样进行变址运算(s[])。而char数组不允许修改。数组与指针在内存模型上有更多区别。比如:
char arr[M]; char *ptr = (char *)malloc(sizeof(char)); printf("%d %d\n", sizeof(arr),sizeof(ptr) );
(6)char指针指向的字符串在内存中只存储了一份,一旦修改所有引用处均被修改,而且char指针难以指定空间大小(必须用malloc)。
char指针初始化后,尽量不要修改其内容(包括用来接受输入),或者使用const来保护其内容。因为char指针指向空间有限,一般只作为字符串常量使用。
3.字符串数组
(1)批量处理字符串可以使用字符串数组,可以使用二维char数组(char s[][])或指针数组(char*s[])。其异同与数值型二维数组和指针数组相同。
(2)由于二维数组的第二维长度必须保证大于最长的字符串,指针数组每个字符串只需要最小长度,所以指针数组的存储密度较高。同样由于初始化困难,指针数组通常作为常量使用。
二、字符串操作函数
字符串的输入输出请参见I/O一文。除特殊说明外,下列函数均需包含string.h。
1.字符串长度:
size_t strlen(const char*);
返回字符串第一个'\0'前的字符数(不包含'\0'),即字符串的有效长度。
2.字符串复制(string copy):
char* strcpy(char*dest,const char*sco);
将参数2(source)中字符串复制到参数1(destination)中,返回指向参数1的指针。需要程序员保证串1足够大。
char*strncpy(char*dest,const char sco,size_t n);
将前n个字符进行复制。
void*memcpy(void*dest,const void*sco,size_t size);
将sro指向的内存内容复制到dest,由size参数指定长度。需包含string.h或memory.h。memcpy可以复制任何内容,strcpy只能复制字符串。
3.字符串比较(string compare):
int strcmp(const char*,const char*);
比较字符串相同返回0,不同返回第一个不同字符ASCII码之差。大小写不敏感,常与逻辑非(!)结合表示字符串相同。
int stricmp(const char*,const char*);
以大小写不敏感的方式复制字符串。
4.字符串连接(string catch):
char*strcat(char*dest,const char*src);
将src字符串接在dest后面(自动移动'\0'),返回dest指针。需程序员保证dest足够长。
char*strncat(char*dest,char*sco,size_t n);
将sco的前n个字符连接在dest上。
5.查找子串(string string):
char*strstr(const char*text,const char*model);
在正文(test)中查找模式子串(model),返回从指向第一个匹配点的char指针。可以使用
strlen(test)-strlen(strstr(test,model))来求得匹配点的下标。
6.查找字符(string character):
char* strchr(char*test,char c);
在test中查找字符c,返回指向c的指针,可以利用长度相减确定下标。也可以用来查找字符串中是否有给定字符集中的字符(或给定字符集中没有的字符)。
; i < strlen(test); i++) { if(strchr(lib,test[i])) { //… } }
在字符集(lib)中查找test中的每一个字符,判断test中的哪一个(或全部)字符是否在(或不在)字符集内。在test中查找lib中的每一个字符通过返回值判断test中有lib里的哪个字符。
7.向字符串格式化输出(string print format):
int sprintf(char*buf,const char*format,…);
用法类似printf,但是向字符串buf输出并返回buf的长度(同strlen),多次向同一字符串输出将覆盖原有内容。需包含stdio.h。
可以用来将数字逐位打印到数组中,对每一位进行处理。但要注意字符串中的是数字字符而不是数字,不要忘记-'0'【9=”9”-”0”】。
8.从字符串格式化输入(string scan format):
int sscanf(char*buf,const char*format,…);
用法类似scanf,但是从buf中读取。成功返回参数数目,失败返回-1。需包含stdio.h
可以用来将字符串转换成数值或者进行匹配输入("x=%lf",从中读取数值)。
sprintf与sscanf函数常用来实现字符串与其它数据类型的转换。
C字符串的更多相关文章
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- JavaScript 字符串实用常操纪要
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- ASP.NET加密和解密数据库连接字符串
大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...
- Javascript正则对象方法与字符串正则方法总结
正则对象 var reg = new Regexp('abc','gi') var reg = /abc/ig 正则方法 test方法(测试某个字符串是否匹配) var str = 'abc123'; ...
- 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)
转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...
- ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案
好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...
随机推荐
- Cerebro_变量名搜索插件
Cerebro 安装 兼容环境:Windows, MacOS, Linux 插件依赖于 Cerebro,下载地址: https://github.com/KELiON/cerebro/releases ...
- Chubby是什么?
先简单的理解,以后补充: 为了解决hadoop分布式系统的一致性问题 ,有很多人提出很多protocol,其中就有有名的Paxos算法(Latex作者提出,算法需要学习), 但是Chubby并不是一个 ...
- Android-Java-面向对象的代码例子
需求一:用手机打电话,发短信,看视频,听音乐,用面向对象思想实现: package android.java.oop01; /** * 1.既然是面向/面对 --> 对象 就要把 (用手机打电话 ...
- 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
本文需要对C#里的LINQ.Lambda 表达式 .委托有一定了解. 在工作中,经常遇到需要对比两个集合的场景,如: 页面集合数据修改,需要保存到数据库 全量同步上游数据到本系统数据库 在这些场景中, ...
- netcore 发布 到 windows server IIS
net core 和普通net 发布没有什么不同,只需要在个别地方注意下: 1. 在visual Studio 2017 发布 2. 把发布好的文件copy到服务器上,并新建一个网站,同时要注意选择无 ...
- owa2013配置HTTPS
- MariaDB 使用正则匹配查询(7)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...
- 文件寄生——寻找宿主的不归路(NTFS文件流实际应用)
咱们今天来研究下NTFS文件流: NTFS文件系统实现了多文件流特性,NTFS环境一个文件默认使用的是未命名的文件流,同时可创建其他命名的文件流,windows资源管理器默认不显示出文件的命名文件流, ...
- CGI + FastCGI(PHP-FPM)联系与区别 【图解 + 注释】
〇.背景 参考了几篇文章,总结成 图解 + 注释 方便以后查阅. 参考资料: 1.https://www.zhihu.com/question/19582041 2.https://segmentfa ...
- Vue + Bootstrap 制作炫酷个人简历(二)
没想到隔了这么久才来更新. 用vue做简历,不是非常适合,为什么呢. 因为简历没什么数据上的操作,一般都是静态的内容. 不过都说了用Vue来做,也只能强行续命了. 这里是我做好的成品 非一般简历 由 ...