memcpy函数头文件_嵌入式Linux开发《C语言专题(五:(3)函数之字符串函数1)》...

d26c5d69dbc9a7bc09e5d248e47ef950.png

在文章中嵌入式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在动态分配内存以及计算数组长度时会经常用到。

测试代码如下图所示:

4cdcd193610d0ff9102617090ff50fd8.png

sizeof、strlen测试字符串、字符数组代码

第一组的结果: *****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 头文件,可以使得编译器对函数执行错误检查,否则会报错。字符串函数以str开头,内存操作函数以mem开头。

总结:这些字符串函数其实自己也可以编写实现相应的功能,但是有些函数系统可能是用汇编代码实现的,在执行效率和代码漏洞之间没有系统已经为我们提供的函数好,我们最好还是直接使用它。软件开发还要一个概念就是学会复用好的代码加快项目开发进度。曾看到这样一句话:寻找一种更好的算法比改良一种差劲的算法更有效率,复用已经存在的软件比重新开发一个效率更高。

有时间可最好以看看这些字符串和内存操作函数的实现过程,一方面是熟悉这个函数的实现,另一方面提高自己的C语言知识。

未完待续,后续继续更新字符串和内存函数具体用法...

更多精彩内容可以关注此头条号:嵌入式软硬件开发 喜欢的话大家可以“评论”,“转发”、“点赞”或者“收藏”,感谢大家。相互交流,共同成长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值