一、字符串字面量(string literal)
字符串字面量(string literal ),有时也成为字符串常量,它是由一对双引号括起来的一个字符序列。如“hello”,“123”等都是字符串。无论双引号内是否包含字符,包含多少个字符,都代表一个字符串字面量。
注意,字符串字面量不同于字符常量。
例如,“a”是字符产字面量,而‘a’是字符常量。
为了便于确定字符串的长度,C编译器会自动在字符串的末尾添加一个ASCII码值为0的空操作符’\0’ 作为字符串结束的标志,在字符串中可以不显示的写出。因此,字符串(string)实际上是由若干个有效字符构成且以字符’\0’作为结束的一个字符序列。
二、字符串的存储
C语言没有提供字符串类型的数据,因此字符串的存取要用字符型数组来实现。一个字符串可以存于字符数组中,但一个字符型数组中存储的并非一定是一个字符串,这要看它的最后一个元素是否为’\0’ ,字符数组是由字符构成的数组,仅当其最后一个元素为’\0’ 时才表示字符串。字符串结束标志’\0’ 也占一个字节的内存,但它不计入字符串的实际长度,之计入数组的长度。
对字符数组,可以采用和其他数组一样的方式进行初始化。
例如:
char str[6]={‘H’,‘e’,‘l’,‘l’,‘o’,‘\0’};
定义了一个有6个元素的字符数组str,其前5个元素分别初始化为’H’,‘e’,‘l’,‘l’,‘o’,最后一个元素初始化为’\0’。
注意,如果没有’\0’,那么数组str就不代表一个字符串。因为’\0’在内存中也占一个字节的存储单元,所以数组定义的长度应大于等于字符串中包括’\0’在内的字符个数。字符数组str初始化后,其存储结构如图所示:
如果省略对数组长度的声明,例如:
char str[ ]={‘H’,‘e’,‘l’,‘l’,‘o’,‘\0’};
那么系统会自动按照初始化列表中提供的初值个数确定数组的大小。
而
char str [ ] = {‘H’,‘e’,‘l’,‘l’,‘o’};
系统将str初始化为一个长度为5的数组,因为存储字符串“Hello”至少需要6个字节的存储单元,长度声明为5时,将会因为没有多余的空间存放编译系统在数组末尾自动添加的’\0’ ,而使系统无法将str当作字符串来处理。所以,当省略对数组长度的声明时,必须人为地在数组地初始化列表中添加’\0’ ,才能将其作为字符串来使用。
还可以采用如下更简单地方法初始化字符数组,即用字符串常量初始化字符数组。例如:
char str[ ] = {“Hello”};
也可省略花括号,直接写成:
char str [ ] = “Hello”;
按这种方式定义和初始化数组,不必指定数组地大小,也不必单独为数组中地每个元素进行初始化,编译系统会根据字符串中字符地个数来确定数组地大小,由于字符串字符量“Hello”地末尾字符是’\0’ ,因此数组的大小为字符串中实际字符地个数加1。
无论采用哪一种方式初始化数组,都要留有足够地存储空间以便存储字符串地结束标志。因此,字符数组地大小一定要比字符串中实际地字符数多1。例如本例字符串地实际长度是5,而字符数组地大小为6。
通常,将一个字符串存放在一维字符数组中,将多个字符串存放在二维字符数组中。当二维字符数组存放多个字符串时,数组第一维地长度代表要存储地字符串地个数,可以省略,但是第二维地长度不能省略,应按最长地字符串长度设定数组第二维的长度。例如:
char weekday[7][10] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
也可以写成:
char weekday[ ][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
但是不能写成:
char weekday[ ][]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
因为二维数组是按行存储的,系统必须知道每一行的长度才能为数组分配存储单元。
数组weekday初始化后的结果为:
数组weekday的第二维长度声明为10,表示每行最多存储有10个字符(含’\0’)的字符串,当初始化列表中提供的字符串长度小于10时,系统将其后剩余的单元自动初始化为’\0’。
若字符串太长,无法写在一行中,则可将其拆分为几个小的片段写在不同行,例如:
char longstring[ ]=“This is the first half of string” “and this is the second half.”;
例题:读取字符串数组长度,并打印。
#include <stdio.h>
char longstr[]="This is the first half of the string"
"and this is the second half";
int main(void)
{
int i;
int n=0;
while(longstr[n]!=0)//读取长度
{
n++;
}
printf("%d\n",n);
// printf("%p",'\t');
for(i=0;i<n;i++)//打印字符串数组
{
printf("%c\t",longstr[i]);
if((i+1)%10==0)
printf("\n");
}
}