复合类型(上)://数组与字符串
1.不能讲一个数组赋给另一个数组
2.如果 long total[500] = {0}; 则其中所有的元素都会被置为0;
如果 long total[500] = {1};则其中只有第一个元素为1,其他元素被编译器置为0;
3.将字符数组初始化为字符串的方法——字符串常量(用引号括起字符串):
char bird[10]="Mr.X"; char fish[ ]="Bubbles";
以上隐式包含结尾的空白符'\0';
4. ‘S’与”S”的区别:‘S’是字符常量;“S”是两个字符即‘S’和‘\0’组成的字符串,且“S”是一个字符串所在的内存地址。
因此 char shirt_size = "S"; 是违法的;
5.当输入串为“Alistair Dreeb”,中间的空格将使得串被默认分为两个,即“Alistair“与”Dreeb”,为了使用cin一次性获取一行数据,可以使用istream中的类,如cin中的类成员函数: getline()与get()函数。
getline 与get 的区别:
getline()函数读取整行,它通过回车输入的换行来确定输入结尾,使用时可cin.getline()。该函数有两个参数,第一个参数用来存储输入行的数组名称,第二个用来存需要读取的字符数。如果这个参数为20,则函数最多读取19个字符,剩下的空间用于存储自动在结尾处添加的空字符。(它通过换行符来确定行位,但不保存换行符。相反,在存储字符串时,它用空字符来替换换行)
get()函数读取时不会丢弃换行符,而是将其留在输入队列。
如对两个数组 name和dessert,arsize=“Alistair Dreeb”,调用cin.get(name,arsize); cin.get(dessert,arsize);
第一次调用输入队列中仍旧存在换行,因此第二次调用将读取到换行并不再进行后续读取。改进方法为两句中加入cin.get();
用于读取换行符或利用cin.get(name,arsize).get();代替第一句或用cin.getline(name1,arsize).getline(name2,arsizse);来代替第一句和第二句。
6.不能将一个数组赋给另一个数组,但可以将一个string对象赋给另一个string且string类支持直接相加进行粘合。
扩展用法:strncat(),strncpy()。strcpy和strcat都是C语言风格字符串,因此用g++编译时需要包含头文件<cstring>,而使用string.size()这种用法时,需要包含<string>类
7.关于整行字符串获取的两种输入:
当定义字符数组char charr1[20]; 和string类对象 string str;时可以采取以下两种输入:
1)cin.getline(charr1,20);
2)getline(cin,str);
首先,采用strlen(charr1)和str,size()对两个串进行长度计数,第一个长度不固定,因为计算时按照截止到'\0'进行计算。第二个长度为0,系统对String类的对象默认赋予长度0。
对于方法一的输入:getline(charr1,20)是istream类的一个类方法,第一个参数是目标长度,第二个是参数数组长度,getline()用此来避免超越数组长。
对于方法二的输入:getline(cin,str)中的getline不是类方法,而是一个函数,将cin作为参数,并没指出stri的长度,因为string的对象将根据输入的字符串自动调整它自己的大小。