第4章 复合类型
4.1
数组
4.1.1 数组、结构和指针的区别
-
数组:可以存储多个同类型 的值,每个值都 独立
的存储在一个数组元素中计算机在内存中依次存储数组的各个元素; -
结构:可以存储多个 不同类型 的值;
-
指针:将数据的 位置/地址 告诉计算机。
4.1.2 数组声明格式
typename
arrayname[array size];
note:array size:其值必须为已知,且为常量
数组可以单独访问元素,方法是使用下标或索引来对元素进行编号,从0开始编号。
4.1.3 sizeof在数组中的运用
sizeof
返回类型或数据对象的长度(单位为字节),若sizeof用于数组名,则返回整个数组的长度,若sizeof用于数组元素,则返回元素的长度。
4.1.4 数组初始化
- 只有在定义数组时才能进行初始化,之后就不能了;也不能将一个数组赋值给另一个数组。
int arr[4] = {0,1,2,3}; //ok
int arr[4];
arr[4] = {0,1,2,3}; //no
ok
int arr1[4] = {0,1,2,3};
int arr2[4];
arr2 = arr1; //no ok
- 若只对数组部分元素进行初始化,则其他元素默认为0,故若整个数组元素赋值为0,则
int arr[100] = {0}; //ok
- 如下赋值方式允许,但是一种 糟糕 的做法,因为需要编译器计算数组元素个数。
int arr[] = {0,1,2,3}; // ok,but worse
- 禁止缩窄数据宽度
如将 float 类型赋给 int
4.2 字符串
- 字符串标志:以空字符(\0)作为结尾
char dog[3] = {‘d’, ‘o’, ‘g’};
// 字符
char cat[4] = {‘c’,‘a’,‘t’,‘\0’};
//字符串,实际只能存储3个字符
note:字符串数组最后一个元素用于存储空字符‘\0’(必须)
- 将数据初始化为字符串的方法:
char cat[4] = “cat”; //字符串常量或字符串字面值
- 字符串常量(使用“”),不能与字符常量(使用‘’)互换。因为:
char s1 = ‘s’; // s
char s1 = “s”; // s + \0
4.3 在数组中使用字符串
//下面为不完整代码
const int size = 15;
char name[size] = “C++ nice”;
name[3] = ‘\0’;
cout << name << endl;
//输出结果
C++
//存在问题的程序
#include
int main()
{
using namespace std;
const int size = 20;
char name[size];
char desert[size];
cout << “Enter your name: \n”;
cin >> name; //Hai
cout << “Enter your favorite
desert: \n”;
cin >> desert; //mian
cout << “I have some delicious ”
<< desert;
cout << “ for you, ”<< name <<
endl;
return 0;
}
//输出结果:
Enter
your name:
Hai
mian baby
Enter
your favorite desert:
I
have some delicious mian for you, Hai.
//程序出错原因:
cin
使用空白(空格、制表符和换行符)确定字符串的结束位置,因此cin 在输入时只读取一个单词,故 将Hai 赋值给 name,而将 mian 赋给 desert。
//解决方法:
cin.getline(name,20); // cin >> name;
cin.getline(desert,
20); // cin >> desert;
4.3.1 解决cin每次只读取一个单词的问题
istream中的类cin 提供面向行的类成员函数,getline()和get(),两个函数不同的是,getline()会将换行符丢弃,而get()会将换行符保留在输入队列中。
1. 每次读取一行字符串输入
(1)面向行的输入getline()
cin.getline(array
name, string length);
note:
string length:应将\0计算在内
(2)面向行的输入get()
cin.get(array
name, string length);
cin.get():
or
cin.get(array
name, string length).get();
由于get会将换行符保留在输入队列中,若要去除,需在加一句,cin.get();
2.getline 与 get 读取空行存在问题
get 会设置失效位,将后面的输入阻断,用 cin.clear() 来恢复输入。
3. getline 与 get 分配的空间不够长
getline 会设置失效位,将后面的输入阻断。
4.3.1 混合输入字符串和数字
//这个程序存在的问题和4.3第2个程序存在的问题相同
#include
int
main()
{
using namespace std;
cout << “What year was your house built?\n”;
int year;
cin >> year;
cout << “What is its street address?\n”;
char address[80];
cin.getline(address, 80);
cout << “Year built: ” << year
<< endl;
cout << “Address: ” << address
<< endl;
cout << “Done!” << endl;
return 0;
}
//输出结果:
What
year was your house built?
1997
What
is its street address?
Year
built: 1997
Address:
Done!
//程序错误原因
cin
使用空白(空格、制表符和换行符)确定字符串的结束位置,因此cin 在输入时只读取一个单词,会将 \n 保留在输入队列中,导致 1997 + \n 中的 \n 赋值给 address
//解决方法:
cin
year;
cin.get();
// cin.get(ch);
or
(cin
year).get(); // (cin >> year).get(ch);
# C++ 常使用指针处理字符串
4.4 string
类简介
string类可用来存储字符串
提供using编译指令,因为string位于名称空间 std
string str = “string”; // ok
cout
<< str[0] << endl; // s, 可以使用数组来访问string对象
cout
<< str[1] << endl; // t
可以使用cin来将键盘宿儒存储到string对象中,可以使用cout来显示string对象,可以使用数组来访问string对象。
类设计让程序能够自动处理string的大小
4.4.1 赋值、拼接和附加
string
str1;
string
str2 = “panda”;
str1 = str2; // 赋值,数组不允许
string
str3;
str3 = str1 + str2; // 拼接
str1 += str2; // 附加