在 C 语言中,字符串应用的非常广泛,但是却没有字符串类型。为了解决这个问题,C语言使用字符数组来存储字符串。
1. 字符串与字符串结束标志.
在 C 语言中没有专门定义字符串类型,通常使用字符数组来存储字符串。由于字符串也采用字符数组进行存储,为了区分普通字符数组和字符串,C 语言规定以字符’\0’作为字符串结束标志。例如:
char c[ ]={‘h’,’e’,’l’,’l’,’o’};
以上字符数组中没有’\0’表示是普通的字符数组。
char c[ ]={'h','e','l','l','o','\0'};
以上字符数组以字符’\0’结束表示是字符串。
分析程序中内存的分布,思考为什么需要'\0'作为结束标志。
除了以上初始化方式,也可以采用字符串对字符数组进行初始化,例如:
char c[ ]=“hello”;
使用字符串方式进行赋值时,系统会自动在字符串末尾添加’\0’,“hello”在内存中实际存情况式如图所示:
h | e | l | l | o | \0 |
通过对比可以发现,使用字符串初始化更加简洁、而且无需指定字符数组长度,系统会自动计算字符串长度并且添加’\0’。
2. ’\0’注意事项
在 C 语言中,采用’\0’作为字符串结束标志,当系统读取到’\0’时,认为字符串结束,’\0’之后的内容将不再读取。因此,通常将’\0’添加在字符串末尾,保证字符串完整输出。不过需要注意的是,’\0’其实可以添加在字符串任意位置上,例如:
char c[ ]={'h','\0','e','l','l','o','\0'};
或
char c[ ]={"h\0ello"};
在字符串中‘\0’可以省略单引号,直接写为\0。
下面通过例子了解一下’\0’的作用。
#includeint main(){ char chs1[ ]={'h','\0','e','l','l','o','\0'}; char chs2[ ]="h\0ello"; printf("%s\n",chs1); printf("%s\n",chs2); getchar(); return 0;}
运行结果如下图:
以%s 格式分别输出字符串,可以看到只输出了”h”。这是因为当系统读取到’h’后面的’\0’时,就认为字符串结束了,后面的内容不再读取,因此只输出”h”。
像 printf 等函数处理字符串的时候通常都是“不见\0 不死心”,因此使用字符串的时候一定不要忘了结尾的\0。
3. sizeof
由于字符串底层采用字符数组进行存储,因此计算字符串长度,等价于计算字符串转化为字符数组后字符数组的长度,例如:
char c[ ]="hello";
上述代码,经过编译后,会转化为以下字符数组形式:
char c[ ]={'h','e','l','l','o','\0'};
前面讲过数组长度计算方式对于计算字符串长度同样适用,例如
int length=sizoef(c)/sizeof(c[0]);
下面通过例子来了解一下。
#includeint main(){ char c1[ ]={'h','e','l','l','o','\0'}; char c2[ ]="hello"; int length1=sizeof(c1)/sizeof(c1[0]); int length2=sizeof(c2)/sizeof(c2[0]); printf("%d\n",length1); printf("%d\n",length2); getchar(); return 0;}
运行结果如图所示:
4. strlen
在 C 语言中,字符串有效长度指的是字符串中’\0’之前的字符个数,不包括’\0’。例如:
char c1[ ]={'h','e','l','l','o','\0'};
c1 字符串有效长度为 5,不包括最后的’\0’。
char c2[ ]={"hello"};
c2 字符串有效长度为 5,不包括系统自动添加的’\0’。
在实际开发中,为了快速计算字符串有效长度,可以使用 C 语言标准库提供的 strlen 函数。
函数原型:int strlen(char str[ ]);
头文件(解释什么是 include):#include
参数列表:str:被计算的字符串。
功能:计算字符串有效长度。
返回值:返回字符串有效长度。
#include#includeint main(){ char c1[ ]={'h','e','l','l','o','\0'}; char c2[ ]="hello"; int length1=strlen(c1); int length2=strlen(c2); printf("%d\n",length1); printf("%d\n",length2); getchar(); return 0;}
运行结果为:
需要注意的是,strlen 函数内部只会计算字符串中’\0’之前的字符个数,’\0’及之后的字符将被忽略。
5. 中文字符串长度
在程序的默认设置中,1 个中文字符占 2 个字节。
char c[ ]=”你好”;
c是中文字符串,有效长度为 2,2 个中文字符占 4 个字节,再加上’\0’占 1 个字节,c在内存中一共占 5 个字节。
6. 字符串元素遍历
在 C 语言中,字符串本质上就是以’\0’结尾的字符数组。同理,字符数组也可以使用 for循环进行遍历。
由于字符’\0’是控制字符,无法在控制台中显示。但是为了让读者感受到字符串末尾确实有’\0’的存在,以下代码中,分别使用%d、%c 格式输出数组元素。
示例代码如下:
#includeint main(){ char c[ ]="hello"; int i; int length=sizeof(c)/sizeof(c[0]); //计算字符串长度 for (i=0;i< length;i++) { printf("%c ",c[i]); printf("%d\n",c[i]); //输出字符 ASCII 码 } getchar(); return 0;}
运行结果为:
7. char* 方式引用字符串
在 C 语言中,字符串存储的方式只有一种,采用字符数组格式进行存储。但是引用的方式却有两种,除了前面介绍的字符数组方式,还可以定义 char*类型的变量进行引用。例如:
char* string="hello";
以上代码表示,定义 char*类型变量 string,并使用字符串进行初始化。这涉及到后续讲的“指针”的问题。
#includeint main(){ char* string="hello"; printf("%s",string); getchar(); return 0;}
运行结果为:
【注意】意用 char*方式引用字符串的时候不能用 sizeof 算字符串的长度。