7.4字符数组

本文详细介绍了C++中字符数组的定义、初始化方法、元素引用、输入输出技巧,以及字符数组与字符串常量的区别。特别强调了使用cin和getline函数处理字符数组时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果数组元素是字符型数据,则该数组就是字符数组。字符数组中的每个元素存放一个字符,占一个字节
字符数组具有数组的一般属性
此外,字符数组和字符串联系是很紧密的,并且由于字符串应用广泛,C++专门为它提供了许多方便的用法和专门的处理函数

1.字符数组的定义与初始化

字符数组的定义方法跟整型数组的定义方法完全一样。如:
char c[10];   //定义一个有10个字符元素的一维数组c

字符数组有2种初始化方法:
1)逐个元素赋值,这种初始化方法跟一般数组一样;
2)用字符串常量初始化

第1种方法的例子如下:
char c1[5]={'H', 'e', 'l', 'I', 'o'};
char c2[5]={'B', 'o', 'y'];

初始化后,c1和c2的存储情况如上图所示。与整型数组初始化类似的是,如果在初始化时所提供的初值个数小于数组长度,对于没有初值的元素,编译器自动赋值为0(注意,这些0在字符数组中有特殊含义,可以充当字符串结束标志)。因此字符数组c2中,后两个元素的值为0
注意在初始化时,所提供的初值个数不能大于数组长度,如下面的语句在编译时有错误
char c3[4]={'H', 'e', 'l', 'l', 'o'];   //(✘) 

第2种方法的例子如下:
char c4[6] = {"Hello"};
char c4[6] = "Hello";
char c4[ ] = "Hello";
3行代码对字符数组的初始化都是对的,而且是等效的

在用字符串常量给字符数组初始化时,是把字符串常量的每一个字符赋值给字符数组中对应的元素。如上图所示
上面在定义c4时,能不能将元素个数定义成5?即:
char c4[5] = {"Hello"}
或:char c4[5] = "Hello";
答案是不可以的,因为字符串常量"Hello"实际上是占6个字节的,后面有串结束标志'\0'。在初始化时,会把'\0'也赋值给某个数组元素

2.字符数组元素的引用

和整型数组类似,只能引用字符数组中的某个元素,而不能引用整个数组。例如,假设已经定义好了两个字符数组a和b:
char a[5], b[5];
下面两种用法都是错误的:
a = {'C', 'h', 'i', 'n', 'a'};    //(✘)
b = a;   //(✘)
引用某个数组元素是正确的,如:
a[0] = b[0] = 'A';    //引用数组元素 

3.字符数组的输入/输出

字符数组的输入/输出主要有三种方法

1)逐个字符输入/输出
cin语句可以对单个字符数据输入、输出,加上循环控制则可以对字符数组进行输入/输出。如下面的代码段可以对一个字符数组进行输入/输出:
char str[10];
for(int i=0;i<10;i++)
    cin >> str[i];
for(int i=0;i<10;i++)
    cout << str[i]; 

2)将字符数组中的整个字符串一次性输入或输出
上面提到对字符数组“只能引用字符数组中的某个元素,而不能引用整个数组”,有一个例外,就是在输入/输出时,可以对字符数组一次性输入或输出。输入/输出时使用数组名。如上面代码中的输入/输出部分可改成:
cin >> str;
cout << str; 

字符数组输入时要注意:必须保证输入字符串的长度小于数组长度。这是因为如果输入串的长度等于或大于数组长度,系统会把超出数组长度的字符存放在数组所占存储空间的后续字节里,而这些字节不属于数组范围,这是很危险的。如下面的例子
char b[8] = {"LOVE"];
char a[8];
cin >> a;   //输入超过8个字符
cout << a <<endl;
cout << b <<endl;

如下图所示,在输入字符数组时,输入10个字符'a',再加上串结束标志'\0',一共11个字符,其中前面8个字符'a'存在在字符数组a中,后面2个字符'a'和串结束标志'\0'覆盖了字符数组b前3个字符。输出字符数组时,也不是只输出8个字符,而是输出10个字符,一直输出每个字符直到串结束标志'\0'为止;输出字符数组b时,输出2个字符a,后边的字符E不会输出来,因为前面有串结束志'\0' 

3)使用cin.getline()函数输入
使用“cin >> 数组名”的形式输入字符串时,是以空格、Tab键、回车键(这3种字符统称为空白字符)作为输入结束的
如果要读入包含空格的字符串,要使用cin.getline()函数,该函数的用法为:
cin.getline(字符数组名,读入字特数的最大数量);
注意,读入字符的数量包括了最后的串结束标记'\0'。因此,cin.getline(s,10)最多只能读入9个字符
此外,在用cin.getline()函数读入一行字符时,如果前一行有输入数据,即有回车换行,则cin.getline()会读入上一行的换行符,必须用getchar()函数跳过这个换行符,才能正确地读入一行字符

4.字符数组与字符串常量的区别与联系

这二者之间有一定的联系,但又有明确的区别
联系:
①字符串常量中的每个元素都是字符型数据,都占一个字节,而且这些字节是连续的。如果有一组数据,其中每个数据的类型都相同,而且这些数据所占的存储空间是连续的,这就是数组的概念。因此字符串常量在内存中是以字符数组的形式存放的,自动在未尾加字符串结束标'\0'
②如果能获得字符串常量“所在数组的数组名”,或者能获得字符串常量存储空间的首地址,那么就可以访问字符串常量中的每个字符
③可以用字符串常量给数组初始化,但要注意,字符串常量最后一个字节是字符串结束标志'\0',这个字节也是要赋值给字符数组中对应元素的

区别:
①字符串常量末尾一定是字符'\0',并以此作为结束标志
②字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0'。但如果字符数组中没有符'\0',那么输出时可能会出现异常
。例如下面的字符数组:
char ch[5]={'H', 'e,' 'l', 'l', 'o'};
printf("%s", ch);     //输出字符数组,因为没有串结束标志'\0',因此输出时会出现异常字符
注意,在用下面的语句定义并初始化字符数组ch后,因为有3个元素没有初始化,编译器会自动赋值为0,而'\0'的编码值就是0,因此ch中也是有串结束标志
char ch[5] = {'H', 'i'}; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值