C和指针(六)字符串、字符、字节

这篇具有很好参考价值的文章主要介绍了C和指针(六)字符串、字符、字节。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

字符串
1,C没有显式的字符串类型,以字符串常量形式出现,存储于字符数组中。

2,C字符串是一串以NUL字节结尾的字符。
1)字符内部不能出现NUL字节。
2)NUL字节是字符串的终止符,不是字符串的一部分,所以字符串长度不包括NUL字节。

3,头文件string.h包含了使用字符串函数所需的原型和声明。
4,标准库函数有些是用汇编语言实现的,目的是充分利用机器提供的特殊字符串操作指令,可最大限度的追求速度。

字符串函数

1,字符串长度strlen返回无符号整型。
1)两字符串比较长度应直接比较大小,因为两无符号整型数相减结果永远大于等于0。
2)比较大小表达式中同时包含有符号和无符号,应将无符号强制转换为有符号再计算。

2,不受限制的字符串函数,通过寻找字符串参数结尾NUL字节判断长度,函数指定一块内存存放结果字符串,在使用这些函数时,应保证结果字符串不会溢出。
1)复制字符串strcpy,将源地址字符串复制到目的地址,如果源地址与目的地址有重叠,结果未字义,目的地址必须是字符数组或动态内存分配的指针,不能使用字符串常量。目的地址原参数内容丢失,以源字符串及NUL字节结尾。使用时应保证目标字符数组空间足以容纳需要复制的字符串,如果字符串比数组长,多余的字符会覆盖数组后面内存空间的值,strcpy无法判断目标字符数组的长度,所以使用时就小心。
2)连接字符串strcat,将源字符串连接到目的字符串后面,如果源地址与目的地址有重叠,结果未定义,须保证字符数组足以容纳源字符串。
3)strcpy和strcat返回指向目标字符数组的指针。
4)字符串比较strcmp,两字符串对应字符逐个比较,直到发现不匹配为止,比较字符的字典序,前一字符串不匹配字符小于后一字符串字符则返回小于零的值,相等返回0,大于返回大于零的值。

3,长度受限的字符串函数,接受显式长度参数,用于限定复制或比较的字符数,防止目标数组溢出。
1)strncpy, strncat, strncmp,复制、连接、比较指定数量字符,与不受限制版本一样,如果源参数和目标参数发生重叠,结果未定义。
2)strncpy将源字符串中指定长度字符复制到目标数组,如果源字符串长度小于指定长度,目标数组使用NUL字符填充,如果长度大于或等于指定长度,指定长度字符复制到目标数组,结果可能不以NUL字节结尾,不是字符串。
3)当使用strncpy函数创建字符串,应确保字符串以NUL字节结尾,否则使用库函数或在printf中使用%s格式码打印时无法检测到结束字节。
4)strncat会在结果字符串后添加NUL字符,最多在目标字符串后连接指定长度+1个字节。5)strncmp最多比较指定长度字符。

4,当调用函数请求操作系统执行例如打开文件等功能出现错误时,操作系统通过设置外部整型变量errno报告错误代码,strerror函数根据错误代码返回指向错误描述字符串的指针。

5,总结
1)strlen函数计算字符串的长度,返回值是一个无符号整数。
2)strcpy函数把一个字符串从一个位置复制到另一个位置。
3)strcat函数把一个字符串的拷贝添加到另一字符串的后面。
4)strcpy和strcat函数都假定它们的参数是有效的字符串,如果源字符串和目标字符串出现重叠,函数的结果未定义。
5)strcmp对两个字符串进行词典序比较,返回值提示第一个字符串是大于、小于还是等于第二个字符串。
6)长度受限的函数strncpy、strncat、strncmp类似对应的不受限制版本,区别在于这些函数接受一个长度参数。
7)strncpy中长度指定了多少个字符将写入到目标字符数组中,如果源字符串比指定长度更长,结果字符串将不会以NUL字节结尾。
8)strncat函数的长度参数指定从源字符串复制过来的字符最大数目,但它的结果始终是以一个NUL字节结尾。
9)strncmp函数长度参数用于限定字符比较的数目,如果两个字符串在指定的数目里不存在区别,便认定是相等的。

查找函数

1,字符查找
1)strchr在字符串中查找某个特定字符第一次出现的位置,返回指向该位置指针,未找到返回NULL指针。
2)strrchr在字符串中查找某个特定字符最后一次出现的位置,返回指向该位置指针,未找到返回NULL指针。
3)strpbrk在字符串中查找另一字符串中任意字符第一次出现的位置,返回指向匹配字符位置指针,未找到返回NULL指针。

2,子串查找
1)strstr在字符串中查找子串第一次出现的位置,返回指向匹配子串的起始位置,未找到返回NULL指针。
2)标准库不存在strrpbrk和strrstr函数。

3,字符串前缀查找。
1)strspn字符串与另一字符串中任意字符匹配的字符数,当出现不匹配字符时停止查找。
2)strcspn字符串不与另一字符串任意字符匹配的字符数,当出现匹配字符时停止查找。

4,标记查找,用于提取分隔符隔开的字符串。
1)strtok第一个参数指定一个字符串,第二个字符串参数是分隔符的集合,在字符串中找到分隔符集合中的下一个标记,将其用NULL结尾,返回指向标记的指针。
2)strtok第一个参数为NULL时,函数在同一个字符串中从被返回的位置像前一次一样查找下一个标记,如果字符串中不存在分隔符,返回NULL指针。
3)典型情况下,第一次调用strtok传递一个指向字符串的指针,之后函数重复调用,第一个参数为NULL,直到返回NULL为止。

字符操作
1,标准库包含两组函数操作单独的字符,原型位于头文件ctype.h中,第一组用于对字符分类,第二组用于转换字符。

2,分类函数接受一个字符值的整型参数,返回整型值,表真或假。
1)iscntrl控制字符
2)isspace空白字符:空格,换页\f,换行\n,回车\r,制表符\t,垂直制表符\v
3)isdigit十进制数字0~9
4)isxdigit十六进制数字,0~9,a~f,A~F
5)islower 小写字母a~z
6)isupper大写字母A~Z
7)isalpha字母a~z、A~Z
8)isalnum数字0~9,字母a~z、A~Z
9)ispunct标点符号,任何不属于数字和字母的图形字符(可打印符号)
10)isgraph任何图形字符
11)isprint任何可打印字符,包括图形字符和空白字符

3,转换函数tolower,toupper将大写字母转换为小写或将小写字母转换为大写,其他不变。

内存操作

1,字符串由NUL字节结尾,内部不能包含NUL字符,非字符串数据内部包含零值时不能使用字符串函数,可使用另一组相关函数,操作与字符串函数类似,可以处理任意的字符序列。
1)内存操作函数与strn前缀的函数不同,遇到NUL字节时不会停止操作。
2)字符串是零个或多个字符的序列,以NUL字节结尾。

2,memcpy从源地址复制n个字节到目标地址,可以复制任何类型的值,字符、整型等。
1)参数类型是void*型指针,任何类型的指针都可以转换为void*型指针。
2)对于长度大于一个字节的数据,在第三个参数里数量和数据类型长度相乘,可以使用这种方式复制结构或结构数组。
3)目标参数与源参数重叠结果未定义。

3,memmove与memcpy类似,但源地址和目标地址可以重叠,将源操作数据复制到临时位置,临时位置不会与源地址和目标地址重叠,再从临时位置复制到目标地址。
1)memmove通常无法使用某些机器提供的特殊字节或字符串处理指令。
2)可能比memcpy慢,但如果源地址与目标地址可能存在重叠时应该使用memmove。

4,memcmp对两段内存内容比较n个字节,按照无符号字符逐字节比较,如果比较的不是单字节数据如整型或浮点数时可能出现不可预料结果。
5,memchr查找字符在字符串中第一次出现的位置,返回指向该位置的指针,共查找n个字节,如果n个字节中未找到该字符,返回NULL指针。
6,memset将目标地址前n个字节设置为字符值,可用于字符数组初始化。文章来源地址https://www.toymoban.com/news/detail-498144.html

到了这里,关于C和指针(六)字符串、字符、字节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 字节数组、各进制字符串数据互转

    日常开发过程中,格式转换是必不可少的重要环节,经常是十进制转十六进制、十六进制转 byte 数组又转换回来来回转换,最然进制转换很基础同时 C# 也提供了很多直接方便进行格式转换的方法,但是封装一个工具类会方便很多,不用每次都手写代码逻辑,之前一直都是简单

    2023年04月27日
    浏览(77)
  • 实现对象转成字节数组(整型支持按位写入,字符串则按字节写入)

    闲着无聊,写了一个对象转换成byte[]的工具类,支持整型按位写入(大大节省空间),具体步骤如下: 1. 定义实体类和注解 2. 工具类     3. 测试结果     参考文章: https://www.cnblogs.com/Dotnet9-com/p/17981055

    2024年01月23日
    浏览(39)
  • C语言指针操作(七)通过指针引用字符串

    通过指针引用字符串详解,以及字符指针变量和字符数组的比较、 在平常的案例中已大量地使用了字符串,如在 printf函数中输出一个字符串。这些字符串都是以直接形式 (字面形式) 给出的,在一对双引号中包含若干个合法的字符。在本节中将介绍使用字符串的更加灵活方便

    2024年02月03日
    浏览(43)
  • 【力扣】344. 反转字符串 <首尾指针>

    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1: 输入 :s = [“h”,“e”,“l”,“l”,“o”] 输出 :[“o”,“l”,“l”,“e”

    2024年02月13日
    浏览(29)
  • FPGA初步学习之串口发送模块【单字节和字符串的发送】

    UART 在发送或接收过程中的一帧数据由4部分组成,起始位、数据位、奇偶校验位和停止位,如图所示。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束,数据位是一帧数据中的有效数据。 通常用的串口数据帧格式是:8位数据位,无校验位,1位停止位。

    2024年02月14日
    浏览(35)
  • Java实现对象转成字节数组(整型支持按位写入,字符串则按字节写入)

    闲着无聊,写了一个对象转换成byte[]的工具类,支持整型按位写入(大大节省空间),具体步骤如下: 1. 定义实体类和注解 2. 工具类     3. 测试结果     参考文章: https://www.cnblogs.com/Dotnet9-com/p/17981055

    2024年01月23日
    浏览(36)
  • C语言之通过指针操作字符串

    下面我们来学习通过指针来灵活操作字符串的方法 我们用对指针的遍历来实现判断字符串的长度 在函数形参的声明中由使用[ ]变为*,这些声明方式是一样的,只是表面上的一些变化,实质上并没有什么变化。 程序中发生实质性变化的事函数体,让我们结合下图来看(以输入

    2024年01月19日
    浏览(38)
  • 《热题100》字符串、双指针、贪心算法篇

    思路:对于输入的的字符串,只有三种可能,ipv4,ipv6,和neither ipv4:四位,十进制,无前导0,小于256 ipv6:八位,十六进制,无多余0(00情况不允许),不为空 class Solution:     def solve(self , IP: str) - str:         if \\\'.\\\' in  IP: #有可能是IPV4             res = IP.split(\\\'.\\\')            

    2024年02月09日
    浏览(34)
  • 8.4 【C语言】通过指针引用字符串

    在C程序中,字符串是存放在字符数组中的。想引用一个字符串,可以用以下两种方法。 (1)用字符数组存放一个字符串,可以通过数组名和下标引用字符串中一个字符,也可以通过数组名和格式声明“%s”输出该字符串。 例:定义一个字符数组,在其中存放字符串“I love

    2024年02月11日
    浏览(26)
  • C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

    分析:    在程序中,定义一个函数 fix,该函数使用指针变量来访问字符串中的每个字符,并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p,表示需要计算长度的字符串。   在主函数 main 中,定义一个大小为 20 的字符数组 a,用于存储输入的字符串。然

    2024年01月21日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包