字符串(character string)是一个或多个字符的序列,如下图所示
"Zing went the strings of my heart!"
双引号不是字符串的一部分。双引号仅告知编译器它括起来的是字符串,正如单引号用于标识单个字符一样。

4.2.1 char类型数组和null字符

c语言中没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。数组由连续的存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符。
数组末尾位置的字符\0。这是空字符(null character),C语言用它标记字符串的结束。字符串不是数字0,它是非打印字符,其ASCII码值是(或等价于)0.C中的字符串一定以空字符结束,这意味着数组的容量必须至少比待存储字符串中的字符数多1.因此,程序清单4.1中有40个存储单元的字符串,只能存储39个字符,剩下一个字节留给空字符。

那么,什么是数组?可以把数组看成是一行连续的多个存储单元。用更正式的说法是,数组是同类型数据元素的有序序列。程序清单4.1通过以下申明创建了一个包含40个存储单元的数组,每个单元存储一个char类型的值:
char name[40]
name后面的方括号表明这是一个数组,方括号中的40表明该数组中的元素数量。char表明每个元素的类型。
字符串看上去比较复杂!必须先创建一个数组,把字符串中的字符诸葛放入数组,还要记得在末尾加上一个\0。还好计算机可以自己处理这些细节。

4.2.2 使用字符串

试着运行程序清单4.2,使用字符串其实很简单。
程序清单4.2 praisel.c 程序

/*praisel.c--使用不容类型的字符串*/
#include<stido.h>
#defin RAISE"You are an extraordinary being."
int main(void)
{
char name [40];
printf("What's your name?");
scanf("%s",name);
printf("Hello,%s.%s\n",name,PRAISE);
return 0;
}

%s告诉printf()打印一个字符串。%s出现了两次,因为程序要打印两个字符串:一个存储在name数组中;一个由PRAISE来表示。运行praisel.c,其输出如下所示:
What's your name?Angela Plains
Helli,Angela.You are an extraordinary being.
你不用亲自把