C++ Primer Plus 学习笔记
第四章 上半
数组
数组的定义格式,形如
typeName arrayName[arraySize];
short moths[12];
从0开始编号,因此上面的语句中moths[0]
是第一个元素,moths[11]
是最后一个元素。
编译器不会检查下标是否有效,不会像VB那样有“下标越界”的报错,因此,需要格外注意。
数组的初始化
int cards[4] = {3, 6, 8, 10}; // 允许
int hand[4]; // 允许
float hotelTips[5] = {5.0, 2.5}; // 允许,之后初始化前两个数,剩下的数设置为0
long totals[500] = {0}; // 允许,所有元素被设置为0
short thing[] = {1, 5, 3, 8}; // 允许,数组长度将被设置为4
hand[4] = {5, 6, 7, 9}; // 不被允许
hand = cards; // 不被允许
double earings[4] {1.2e4, 1.6e4, 1.1e4, 1.7e4}; // C++11允许
unsigned int counts[10] = {}; // C++11允许,所有元素被设置为0
long plifs[] = {25, 92, 3.0}; // 不被C++11允许,禁止缩短转换
char slifs[4] {'h', 'i', 1122011, '\0'}; // 不被C++11允许,禁止缩短转换
字符串
C++有两种处理字符串的方式。一种是C-风格字符串,就是在类型为char的数组末尾加上一个元素'\0'
。
也能用""
来表示,如char bird[11] = "Mr. Cheeps";
。
数组方式的字符串读取一次性读取一行的输入时,要使用getline()
函数,用法如下cin.getline(arrayName, arraySize);
该函数会一次性读取整行,根据换行符来确定行尾,并将换行符用\0
代替。
也可以使用get()
,用法如下cin.get(arrayName, arraySize);
。get()
同样根据换行符确定行尾,但会将换行符保留,不会存在数组中,导致第二次输入无效,因此需要在使用一次get()
。
像这样
// 方法一
cin.get(arrayName, arraySize);
cin.get();
// 方法二
cin.get(arrayName, arraySize).get();
同样,如果需要先输入数字,再输入字符串,也要使用get()
int year;
(cin >> year).get();
char address[80];
cin.getline(address, 80);
如果要复制数组风格的字符串,需要使用strcpy
,用法如下strcpy(charr1, charr2);
,意思是将charr2的值复制到charr1。
使用strcat()
将字符串添加到另一个字符串的末尾,用法如下strcat(charr1, charr2);
,意思时将charr2的值添加到charr1的后面。
strlen(charr);
用于检查字符串长度。
另一种是string
类。使用它必须调用头文件string
,同时需要通过using
编译指令或者使用std::srting
来引用。它的初始化方法和数组风格的字符串一样,但无需声明长度。
// string类 字符串初始化
string str1;
string str2 = "abcd";
string str3 {"abcd"};
string str4 = {"abcd"};
string
类的复制、拼接比数组方便的多
str3 = str1 + str2; // 拼接
str1 += str2; // 拼接
str2 = str1; // 复制
str1.size(); // 读取字符串长度
输入字符串的方法和数组基本相同,使用cin
。只有整行输入有点区别。
getline(cin, str); // string类的整行输入
cin >> str2; // string类的一般输入