大家好,欢迎来到IT知识分享网。
在文章中嵌入式Linux开发《C语言专题(五:(1)函数基本概念)》和嵌入式Linux开发《C语言专题(五:(2)函数之递归函数)》分别对C语言中函数的基本概念和递归函数做了详细讲解,这一部分将讲解C语言中字符串和内存函数的使用。在实际的研发和面试中会经常用到字符串和内存操作函数。
不像Java C#等语言中有字符串String类型,C语言中没有显式字符串类型,它以字符串常量的形式出现或者存储于字符数组中。字符串常量常用于在代码中不需要修改的字符串。所有其它字符串都存储于字符数组或者动态分配的内存中。而在实际的研发中字符串和内存函数用的比较多,所以归纳总结了字符串函数的用法。在讲解之前,先了解什么是字符串。
(1)什么是字符串?
字符串是由多个字符组成,并且是以\0结束,但是\0并不是字符串本身的一部分,因此字符串的长度不包括\0本身。说白了就是给定字符串的首地址,又知道了字符串的结束标志,所以也就可以计算出字符串的长度。用strlen计算。其实\0是转义字符 。字符串定义、初始化在嵌入式Linux开发《C语言专题(六:(1)数组-必备基本概念)》文章中字符数组部分简单介绍过 。如char * a=”hello world”;定义字符串常量 char a[5];定义字符数组。
(2)字符串的长度
字符串的长度就是它要包含的字符个数,不包含\0结束标志。因此字符串中不可能包含\0的字符。常用strlen()字符串函数来计算字符串长度,注意是字符串。注意与sizeof关键字的区别,sizeof主要对变量、数据类型(int char float double等)以及自己定义的类型(比如在结构体中定义各种数据类型的变量,手动计算有时候会出错同时也要考虑到边界对齐问题,所以让编译器帮助我们计算我们自己定义的类型)来计算所占的内存空间。sizeof在动态分配内存以及计算数组长度时会经常用到。
测试代码如下图所示:
第一组的结果: *****sizeof(a) = 12 strlen(a) = 11***** sizeof的结果值比strlen的值多1的原因是多加了\0这个字符串结束符。*****sizeof(p) = 4 strlen(p) = 11*****因为p是指针,所以编译器在内存中占4个字节(对于32位系统),而sizeof又是计算数据类型在内存中占得空间,所以结果为4.p所指向的是字符串常量”hello world”的首地址,而strlen是计算字符串的长度,所以结果为11.
第二组结果: *****sizeof(a) = 5 strlen(a) = 5***** 是因为字符数组a的大小是5,但是赋值的时候多余5个字节,所以就相当于把”hello”这5个字节赋值给字符数组a,又因为这5个字节中没有\0这个字符所以sizeof(a)和 strlen(a)结果一样,从打印数组a中的元素就可以看出:a[0] = h、a[1] = e、a[2] = l、a[3] = l 、a[4] = o 。*****sizeof(p) = 4 strlen(p) = 11*****同上。
因此我们在使用sizeof运算符和strlen函数的时候一定要注意使用的场景。
(3)字符串操作函数有:strlen、strcpy、strncpy、strcat、strncat、strcmp、strncmp、 strchr 、strrchr、 strpbrk、strstr 、strspn、 strcspn
(4)内存操作函数有:memcpy、memmove、memset(bzero )、memcmp 、memchr
后续对这些函数的使用进行详细讲解。
在头文件string.h中包含所有字符串和内存函数的声明即函数原型,我们在使用字符串操作函数时一定要包含这个#include <string.h>头文件,可以使得编译器对函数执行错误检查,否则会报错。字符串函数以str开头,内存操作函数以mem开头。
总结:这些字符串函数其实自己也可以编写实现相应的功能,但是有些函数系统可能是用汇编代码实现的,在执行效率和代码漏洞之间没有系统已经为我们提供的函数好,我们最好还是直接使用它。软件开发还要一个概念就是学会复用好的代码加快项目开发进度。曾看到这样一句话:寻找一种更好的算法比改良一种差劲的算法更有效率,复用已经存在的软件比重新开发一个效率更高。
有时间可最好以看看这些字符串和内存操作函数的实现过程,一方面是熟悉这个函数的实现,另一方面提高自己的C语言知识。
未完待续,后续继续更新字符串和内存函数具体用法…
更多精彩内容可以关注此头条号:嵌入式软硬件开发 喜欢的话大家可以“评论”,“转发”、“点赞”或者“收藏”,感谢大家。相互交流,共同成长。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/83933.html