字符数组是元素类型为字符的数组,它既具有普通数组的一般性质,又具有某些特殊性质。
字符串常量是用双引号包围的字符序列。存储字符串常量时,系统会在字符序列后自动加上'/0',标志字符串的结束。字符串的长度定义为字符串中的有效字符数,不包括结束标志'/0'和双引号。
字符串变量是以'/0'作为结束标志的字符数组。字符串变量用于存储和处理字符串常量。在书中统称为字符串的,既可能是字符串常量也可能是存储了字符串常量的字符串变量,即特殊的字符数组。
字符数组有两种用法:一是当作字符的数组来使用。这时的用法与整数的数组、 实数的数组等相同,对字符数组的输入、输出、赋值、引用等都是针对单个的元素进行。二是更为重要的用法即存储、处理字符串。这时它除了可以像普通数组一样使用外,还可以把字符串作为一个整体进行操作。
字符数组的初始化
(1)用字符对字符数组初始化 这时把字符数组当作普通数组看待, 产生的数组不会有结束符'/0'。当数据量很大时,使用这种方法的工作量是繁重的。
例:char rat[5]={'H','E','L','L','O'};
(2)用字符串常量对字符数组初始化,这时把字符数组当作字符串变量看待。
例:char panic[6]={"HELLO");
这时存放在数组panic中的字符除了H,E,L,L,O之外还有结束标志'/0',因此与下面的初始化等价:
char panic[6]={'H','E','L','L','O'};
注意: 第二个说明语句中有6 个字符, 因此字符数组panic 的长度是6, 而字符串"HELLO"的长度却是5,不把'/0'计算在内。
C语言也允许在用字符串初始化时省略花括号。
char panic[]="HELLO";
如果在说明语句中指定了数组的长度,那么其大小不得小于初始化字符串的长度。多余的元素位置被系统自动初始化为0。实际上'/0'就是ASCII码为0的字符,因此'/0'和整数0是一回事。
例:char posia[11]="string";
下面的初始化却是错误的:
char neg[5]="double arrow"; /*初始化数据太多*/
3)字符数组两种不同用法举例
在前面已经说明,字符数组既可当作普通数组使用也可用于存储和处理字符串.下面是对应两种用法的例子。
例: 字符数组用法示例之一,当作普通数组。
#include<stdio.h>
#define SIZE 10
main()
{
char ary1[SIZE]={'P','L','O','T'};
char ary2[SIZE];
char ch;
int i,j;
for(i=0;i<4;i++) /*输出数组ary1*/
printf("%c",ary1[i]);
printf("/n请输入一行字符/n");
for(i=0;i<SIZE;i++) /*输入数组ary2*/
{
scanf("%c",&ch);
if(ch=='/n')
break;
ary2[i]=ch;
}
printf("/n");
for(j=0;j<i;j++) /*输出数组ary2*/
printf("%c",ary2[j]);
}
程序中为了处理数组使用了循环,并且使用了ch,i,j等工作变量,增加了程序的负担,而且又缺乏灵活性,故这种方法很少使用。与下面完成同样功能的程序相比,本程序复杂多了。
例: 字符数组用法之二,当作字符串。
#include<stdio.h>
#define SIZE 10
main()
{
char ary1[SIZE]="PLOT";
char ary2[SIZE];
printf("%s/n",ary1); /*输出数组ary1*/
printf("请输入一行字符:/n");
scanf("%s",ary2); /*输入数组ary2*/
printf("输入字符串是:/n");
printf("%s",ary2); /*输出数组ary2*/
}
程序没有用循环,只是直接调用scanf和printf函数完成输入输出。程序之所以能够自动识别出字符串有几个字符,是因此规定了字符串必须以'/0'作为结束, 像printf之类的函数输出字符串时一边检测一边输出,一旦碰到'/0',便认为字符串已经结束,之后就停止工作。这样一来'/0'对整个字符串来说至关重要了。一旦由于某种原因字符串的'/0'被改为别的值,字符串就无法终止,printf函数就不能正常工作了。
请注意printf和scanf函数处理字符串数组的特点。直接使用数组名作为参数。
例:printf("%s/n",ary1);
这种直接使用数组名的用法表示把字符串数组当作一个统一整体来处理,只适用于字符串,对别的类型的数组是不能这样用的。