1.char型数组的字符串在初始化为字符串常量或者后续赋值时
(1) 没有声明数组的元素个数
如 char str[ ] = “CSDN”;
此时编译器会自动在字符‘N’后添加一个空字符’\0’以表示结尾
因此数组的长度是5个字节
(2) 声明时确定了元素个数
char str2[8] = “CSDN” ;
此时只对前4个char型元素进行了赋值,第五个元素由空值字符 ’\0 自动加到结尾,同时其余3个元素设置为\0,如下表:
C | S | D | N | \0 | \0 | \0 | \0 |
[0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] |
同时应注意:当明确了char型数组的元素个数时,初始化数组或后续对数组进行赋值时,别忘了将结尾的空字符需要占一个元素计算在内,不然会发生数组界限溢出。
如:char str3[8] = “CSDNPRO” ; // valid
char str4[8] = “CSDNPLUS”; // invalid error:“str4”: 数组界限溢出
2.区分对char型数组使用函数strlen() 和sizeof()的返回值 (注意sizeof不是函数)
由于数组在结尾会自动添加一个 ‘\0’ 字符以表示结尾,且char型元素占8位(1个字节),该数组的长度(大小)即为5个字节,所以使用sizeof(str)时返回的是5。
而使用strlen(str)函数时返回的值该字符串的实际字符长度,结尾自动添加的空字符不计算在内,因此长度为4个字符(不是字节)。
3.使用cin流对象 对char型数组进行键盘输入时
(1)输入一个字符串:
char str[20];
cin >> str; // str = "abcdefg"
cout << str; // show: abcdefg
(2)输入一行字符串时:
char str2[20];
cin >> str2; // str2 = "abcd efg"
cout << str2; //show:abcd
原因:char型数组的字符串以 '\0' 表示结尾,因此cin使用空白(空格)来确定字符串的结束位置,在对str2进行赋值时,在cin中abcd后的空格符导致之后的efg没有输入到数组str2中。
解决方法:通过cin对象调用类当中类成员函数getline(用来存储该输入行的数组名称,读取的字符数)或者get(参数同理)
4.区分单引号和双引号的使用
char s1 = 'C'; // valid
char s2 = "C"; // invalid
单引号表示的是一个字符常量,是字符串编码的简写。在ASCII系统上,'C'只是67的另一种写法,因此第一条语句将67赋值给s1。
双引号表示的是一个字符串常量,表示的是 两个字符 'C' 和 '\0' 组成的一个字符串,因此将其赋值给char类型的s2是不合法的。