字符数组初探

字符数组非常特殊,要牢记。




字符数组既可以用一组由花括号括起来、逗号隔开的字符字面值进行初始化。
例如:char my_char1[3] = {'a', 'b', 'c'};//此时my_char1数组的维数是3。


也可以用一个字符串字面值进行初始化,注意字符串字面值包含一个额外的控制符(null)。
例如:char my_char2[4] = "abc";//此时my_char2数组的维数是4。如果写成3就错误了,忘记最后一个非显示null了。


通过以上可以知道字符串字面值的类型是字符常量的数组,即字符串字面值的类型就是const char类型的数组。
C++从C语言继承下来的一种通用结构是C风格字符串,而字符串字面值就是该类型的实例。实际上,C风格字符串既不能确切的归结为
C语言的类型,也不能归结为C++语言的类型,而是以空字符null结束的字符数组。
例如:
      char my_char3[] = {'w', 'o', 'r', 'd'}; //不是C风格字符串,只是一个不含有结束符null的字符数组
      char my_char4[] = {'w', 'o', 'r', 'd', '\0'};   //C风格字符串
 char my_char5[] = "word"; //C风格字符串
 const char *my_cp = "word";
 char *my_cp1 = my_char3; //指针my_cp1指向my_char3
 char *my_cp2 = my_char4; //指向数组第一个元素的指针
 
可以用(const)char*类型的指针来操纵C风格字符串。
例如:
 const char *cp = "some value";
   while (*cp) {
    //do something to *cp
++cp;
}
while语句的循环条件是对const char*类型的指针cp进行解引用,直到cp指向结束字符数组的null时循环结束


C语言标准库(string.h)提供很多处理C风格字符串的库函数,要使用这些标准库函数必须包含相应的头文件,cstring是string.h的C++版本


#include <cstring>
strlen(s)           返回 s 的长度,不包括字符串结束符 null
strcmp(s1, s2) 比较两个字符串 s1 和 s2 是否相同。若 s1 与 s2 相等,返回 0;若 s1 大于 s2,返回正数;若 s1 小于 s2,则返回负数
strcat(s1, s2) 将字符串 s2 连接到 s1 后,并返回 s1
strcpy(s1, s2)      将 s2 复制给 s1,并返回 s1
strncat(s1, s2,n)   将 s2 的前 n 个字符连接到 s1 后面,并返回 s1
strncpy(s1, s2, n)  将 s2 的前 n 个字符复制给 s1,并返回 s1


注意:传递给这些标准库函数例程的指针必须具有非零值,并且指向以 null 结束的字符数组中的第一个元素。
 如果必须使用 C 风格字符串,则使用标准库函数 strncat 和 strncpy 比 strcat 和 strcpy 函数更安全,使用标准库函数 strncat 和 strncpy 
 的诀窍在于可以适当地控制复制字符的个数。特别是在复制和串连字符串时,一定要时刻记住算上结束符 null。在定义字符串时要切记预留存放 null字符的空间
 
 
最后:
应该尽量使用标准库类型的string,对大部分应用而言,使用标准库类型 string,除了增强安全性外,效率也提高了,因此应该尽量避免使用 C 风格字符串。


------------------------------------------
char name[20] = "chenglong";
cout << name; //输出的不是字符数组的首地址,而是整个字符数组
char ch = 'z';
cout << &ch; //输出的不是字符ch的内存地址,而是z字符加上其他东西
------------------------------------------
关于上面的代码,特别的C++为了与C兼容关于字符数组做了特殊处理:
输出字符变量地址的时候,改成输出从这个内存单元开始存放的
一系列字符,到向后遇到第一个'\n'为止。


------------------------------------------
char* name[20];
cin >> name;
------------------------------------------
输入的时候从这个地址开始摆放字符最后再补上'\n'


如果想得到字符变量的地址可以这样:
------------------------------------------
cout << hex << (int)&ch << endl;
------------------------------------------








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值