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";

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

数组名 0 1 2 3 4 5
arr h e l l o \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和指针》

猜你喜欢

转载自blog.csdn.net/h792746371/article/details/75286099
今日推荐