首页 > 编程笔记

C语言字符数组的定义、初始化和使用

什么叫字符数组?有限个字符可以存储在一个一维数组中,数组中的每个元素都是字符,那么这个一维数组就是字符数组。如果有多个字符串则可以存储在二维字符数组中。本文介绍如何利用字符数组快速实现对字符串的操作。

字符数组概述

在C语言中,字符串是由一维字符数组存储的,我们可以像处理数组元素一样处理字符串中的每个字符。

字符串常量是使用双引号包含的字符序列。例如下面就是字符串。

"hello world"
"123abc,.?"

在 C 语言中,字符串存储时以一个指定的转义符 \0作为结束标志。字符串中每个字符在内存中占 1 个字节,例如 “hello world” 字符串,它并不像我们看到的占用了 11 个存储字节,而是占用了内存中的 12 个字节。'\0' 是编译器自动加上的,是字符串的一部分。

字符串“hello world”在内存中的存储形式如下图所示。


注意:字符串由有效字符和字符串结束符 '\0' 组成,系统对字符串操作时,并不是按定义时的字符数组长度扫描所有存储单元,而是扫描到 '\0' 即认为串结束,不再继续扫描 '\0' 之后的存储单元。

字符数组的定义

C语言一维字符数组定义的一般形式如下:

char 数组名[常量表达式];

例如:

char name[10];

定义了一个可以保存 1 个姓名的字符数组,这个姓名最长可以存储 10 个字符(含字符串结束符'\0')。系统给该数组分配 10 个字节,姓名中的每个字符占一个字节。

姓名中的每个字符可以用不同的下标表示,下标范围是 0~9。name[2] 表示姓名中的第 3 个字符。

C语言二维字符数组定义的一般形式如下。

char 数组名[常量表达式][常量表达式];

例如:

char name[5][10];

定义了一个可以保存 5 个姓名的字符数组,每个姓名最长可以存储 10 个字符(含字符串结束符'\0')。系统给该数组分配 50 个字节,姓名中的每个字符占一个字节。

第 n 个姓名用行下标表示,下标范围是 0~4;每个人姓名中的每个字符用不同的列下标表示,下标范围是 0~9。name[2][0] 表示第 3 个姓名中的第 1 个字符。

字符数组的初始化

C语言字符数组的初始化通常是逐个字符赋给数组中各元素。例如:

char str[11]={ 'W','E ','L','C',' O','M',' ','T','O',' ','C'};

即把 11 个字符分别赋给 str[0]~str[10] 这 11 个元素。

str[0]='W',str[1]='E',str[2]='L',str[3]='C',str[4]='O',str[5]='M',str[6]='',str[7]='T',str[8]='O',str[9]='',str[10]='C'。

如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即 '\0')。

字符数组的引用

字符数组用来存储字符串,串中的每个字符用下标引用。

【示例1】

输入字符串 “welcome to China”,然后输出。代码如下:
#include <stdio.h>
int main()
{  int i;
   char c[16]={'w','e','l','c','o','m','e', ' ','t','o',' ','C','h','i','n','a'};   /*初始化字符串*/
   for (i=0;i<16;i++) /*输出字符串*/
      printf("%c",c[i]);
   printf("\n");
}
运行结果:

welcome to China

上述程序中采用初始化的方式将字符串 "welcome to China" 初始化到字符数组中,当然也可采用字符串的方式,下面将会介绍。

字符数组的输入与输出

由于字符串放在字符数组中,因此,对字符串的输出也是对字符数组的输出。例如:
char s[11];
for(i=0;i<11;i++)        /*输入*/
    scanf("%c",s[i]);
for(i=0;i<11;i++)        /*输出*/
    printf("%c",s[i]);
上述例子适用于字符数组中存储的字符不是以 '\0' 结束时,用格式控制符“%c”将字符数组中的每个元素输出。

当然,用字符数组处理字符串时,也可以与 “%s” 格式控制符配合,完成字符串的输入/输出。例如:

char s[11];
scanf("%s",s);  /*输入*/
char s[ ]="Hello,China";
printf("%s",s);   /*输出*/

【示例2】

采用 printf() 函数和 scanf() 函数输入/输出一个字符数组。代码如下:
#include <stdio.h>
int main()
{   int i;
   char st[15];
   printf("input string:\n");
   scanf("%s",st);
   for(i=0;i<15;i++)
      printf("%c",st[i]);
}
运行结果:

input string:
hello-chaina!
hello-chaina!


本例中,由于定义数组长度为 15,因此输入的字符串长度必须小于 15,以留出一个字节用于存放字符串结束标志 '\0'。应该说明的是,对一个字符数组,如果不作初始化赋值,则必须说明数组长度。

注意:当用 scanf() 函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。例如,当输入的字符串中含有空格时,运行情况为:

input string:
this is a book

输出为:

this

从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可使用 gets() 函数输入带空格的串。

优秀文章