一维字符数组一般用于存储和表示一个字符串,二维字符数组一般用于存储和表示多个字符串,其每一行均可表示一个字符串。
一维字符教组的定义及初始化
一维字符数组的定义格式为:
char 数组名[数组大小];
例如:
char c[10];
该语句定义了一个一维字符数组 c,大小为 10,即占 10 个字符变量空间,最大可存储长度为 9 的字符串(第 10 个字符为 '0')。由于没有显式给每个字符变量赋值,故每个字符变量为随机值。
可以采用单个字符逐个赋值的方式初始化,也可以使用字符串初始化的方式。
采用逐个字符赋值的方式
1) 当字符个数少于数组空间大小时,例如:
char c[8] = {'h','e','l','l','o',};//始值个数5小于数组空间个数8
该语句定义了含 8 个字符变量的一维字符数组,前 5 个字符变量分别显式初始化为 'h','e','l','l','o' 等 5 个字符,后 3 个字符变量为空字符 '/0'。其存储形式如下。
当字符数组中含有字符串结束字符 '/0' 时,可以使用 printf 函数及格式控制符 %s,输出该字符数组中的字符串,如下所示。
printf ("%s”,c); //数组名 c 为首字符 'h' 的地址或者为 &c[0]
注意:使用 printf 函数及格式控制符 %s,输出一个字符串时,输出列表中一定为某个字符的地址,且从该字符开始的串一定有结束标志 '/0'。该语句的功能是:从输出列表中的该地址开始,到第一次遇到 '/0' 为止,这之间的字符全部输出。
通常一维数组初始化时,其第一维大小可以省略,例如:
char c[]={'h','e','l','l','o'};
对应的数组存储形式如下所示。
由于该数组中不存在 '/0' 字符,故不能使用 printf("%s",c); 输出。
char c[8] = {'h','e','l','l','o'};
不等价于
char c[]={'h','e','l','l','o'};
2) 当字符个数等于数组空间大小时,例如:
char c[5]={'h','e','l','l','o'};//初值个数5等于数组大小5
执行该初始化语句后,数组的存储形式如下所示。
char c[5]={'h','e','l','l','o'};
等价于
char c[]={'h','e','l','l','o'};
由于该字符数组中不包含字符串结束标志 '/0',故不能使用 printf("%s",c); 输出其中的字符串。输出结果中一般含有随机乱码。
这种情况一般采用循环语句逐个输出该数组中的每个字符。
int i; for(i=0;i<5;i++) //循环次数为字符个数或数组大小 printf ("%c",c[i]);//格式控制符为%c,输出列表中为字符变量c[i]
3) 当字符个数多于空间大小时,编译时报错。例如:
char c[4] = {'h','e','l','l','o'}; //错误。初值个数5大于数组大小4
采用字符串初始化的方式
在 C 语言中,字符串一般是指含有字符串结束符 '/0' 的若干个字符的集合。而使用双引号括起来的字符串常量,默认隐含字符串结束符 '/0'。例如:
char c[12] = {"C program"}; //注意该数组大小应足够大
用字符串对字符数组初始化时,一般大括号可以去掉,即:
char c[12]="C program";
该初始化语句与以下三条语句均是等价的。
char c[12]= {'C',' ','p','r','o','g','r','a','m','/0','/0','/0'};
或者:
char c[12] = {'C',' ','p','r','o','g','r','a','m','/0'};
或者:
char c[12] = {'C',' ','p','r','o','g','r','a','m'};
以上等价初始化语句有一个共同特点:数组的大小均为指定值 12。
其数组存储形式均如下所示。
采用字符串对字符数组进行初始化时,一般省略一维数组空间的大小,即:
char c[]="C program";
该数组中除了存储字符串中的 9 个有效字符外,还自动在字符串的结尾存储 '/0' 字符。即该数组的大小为 10。其存储形式如下所示。
为节省空间及书写方便,当用字符串对字符数组初始化时,一般均省略其一维的大小。
一维字符数组的引用
字符数组中的每一个元素都是一个字符,可以使用下标的形式来访问数组中的每一个字符。
例如
char c[]="abcd";
定义了一个一维字符数组 c,用字符串常量对其初始化,该数组大小为 5,前 4 个元素的值分别为 'a'、'b'、'c'、'd',第 5 个元素的值为 '/0'。其存储形式如下所示。
可以使用 c[i] 引用该数组中的每个元素,例如:
c[2]='f'; //把'f'赋给元素c[2] scanf("%c",&c[3]); //输入一个字符,保存到元素c[3]对应的地址空间中 printf("%c",c[1]); //输出元素c[1]中的字符值
如果每次输出一个字符,可使用循环语句输出字符数组中保存的字符串,参考代码如下。
int i; for(i=0;c[i]!='/0';i++) //当前i号位置的字符变量只要不是结束符就输出 printf("%c",c[i]);
一维字符教组的应用举例
C 语言中的字符串总是以 '/0' 作为结束标志,所以字符串的长度指的是从字符串的首字符开始,到第一次遇到 '/0' 为止,这之间所包含的有效字符的个数,结束符不计算在字符串长度内。
如字符串”abcd”,C 语言中字符串最后一个有效字符后隐含 '/0' 字符,故该字符串长度为 4。
【例 1】编写实现求一个字符串长度的程序。
分析:把字符串保存在一维字符数组中,其长度用 len 表示,初始为 0。算法为:从该数组的首元素(0 号位置)开始,只要当前元素不为 '/0',len 加 1,直到遇到 '/0' 为止,此时 len 的值即为该字符串的长度。
实现代码:
#include<stdio.h> int main (void) { char str[]="A good book is a good friend!"; int i, len=0; //len必须初始化为0 for(i=0;str[i]!='/0';i++) len++; printf ("The length is: %d/n",len); return 0; }
运行结果为:
The length is: 29
【补充】该程序循环部分也可以使用 while 循环,如下所示:
i=0; while(str[i]!='/0') { len++; i++; }
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/21568.html