C语言字符串那些事儿

1. 字符串基础知识

1.1 什么是字符串

字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。其中NUL是人为定义用作字符串结尾的标志,所以字符串的长度不包括NUL字节。
NUL字节其实就是ASCII码为0的数。
例:

char *line = "world0";

则在gdb调试发现:

(gdb)x/7d line
0x8048470 119   111   114   108   100   48   0

分别对应”world90”的ASIC码,而最后的一个0表示字符串的结尾。

1.2 字符与字符串

C语言字符串常量用一对双撇号(”“)括起来,而字符常量用一对单撇号(”)括起来,如下面的例子所示:

char ch = ' a '
char *str = " a ";

‘a’是一个字符常量,而“a”确是一个字符串常量,只不过这个字符串的长度是1,即只有一个字符。字符串常量和字符常量的不同在于系统给字符串常量的结尾加上一个字符串结束标志’\0’, ‘\0’可以理解成0b00000000。
不能将一个字符串常量给字符变量。

char ch = "a"; //错误,GNU下会产生warning

1.3 字符串变量

C语言中没有专门的字符串变量,字符串用一维字符数组表示。数组名是字符数组地址,字符元素连续存储。
如:

char arr[5];    /*充当字符串变量的角色*/
arr[5] = = "hello";

则数组中存储的数据如下:

数组名012345
arrhello\0

除了字符数组,C语言还支持另外一种表示字符串的方法,就是直接使用一个指针指向字符串,如下面程序所示:

char *str;  /*充当字符串变量的角色*/
srt = = "hello";

gdb调试结果如下:

(gdb)x/6c
0x80484470: 104 'h' 101 'e' 108 'l' 108 'l' 110 '0' 0 '\000'

1.3 字符串的初始化

1.3.1 一般初始化

char CharArray[6]={'h','e','l','l','o','\0'};
char CharArray[5]={'h','e','l','l','o'}; //字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0',向这种是完全合法的。但与上面的字符数组的长度不同,
char *p1 = {"Hello"};
char *p1 = "Hello"; //也可以省略大括号

1.3.1 重点解释两种初始化方法

char *p1 = "Hello";//字符指针
char p2[] = "Another Hello";  //字符数组,值得注意的是当数组大小省略时,系统自动计算大小。但注意其大小包含结尾的'\0'

对于个字符指针的初始化方式,是直接将常量区中字符串对应的地址赋值给p1,所以这个地址其实就是常量区中Hello对应的地址,所以用如*p1 =’h’这种操作是不行的,因为p1指向的是常量区的内存,常量区的内存是不允许修改的,在编译期间就已经确定了。

对于个字符数组的初始化方式,将常量区中对应的字符串,以4个字节为单位,一个一个复制到栈内存中,最后局部指针p2指向这片内存。所以*p2 =‘h’,这个操作是允许的,因为这修改的是栈内存中的内容。

另外要注意的是:

char arr[10];
arr[] = "hello";

这种写法是错误的,因为C语言并没有提供可以直接操作字符串的运算符;“=”可以用于其他数据类型的赋值,但是不可以直接给字符串赋值。

2. 字符串常用库函数

待更新

参考

C语言字符串指针(指向字符串的指针)
C语言中字符数组的初始化与赋值
《C和指针》

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值