我们常常发现简单的数据类型已经不能满足编程过程中所需要的数据要求。因此,在C++语言中提供了一些复合类型来表示这些数据,本博客主要是针对于数组进行说明。
1 数组
数组是一种数据格式,能够存储多个同类型的值。数组的创建可以通过声明语句来实现,数组声明时应当注意下列三点:
- 存储在每个元素中的值的类型;
- 数组名;
- 数组中的元素数。
声明数组的通用格式为:
类型名 数组名[数组大小arraySize]
## example
int cards[10]
float loans[50]
char name[20]
arraySize必须是整型常数或const值,也可以是常量表达式(8*sizeof(int)),也就是说arraySize的值在编译时是已知的。
数组的初始化是通过使用大括号将数据括起来,数据之间用逗号隔开,例如
int number[4] = {10,,20,,30,,40};
int number[] = {10, 20, 30, 40}; // 与第一个是等价的,编译器会自动的计算元素个数。
数组初始化时,如果提供的值少于数组的元素数目,则数组的一部分被初始化,编译器将剩下的元素设置为0,比如
float hotelTips[5] = {5.26, 2.56, 3.48};
// 该数组将前面三个元素初始化,剩余的两个值被设置为0.
在数组初始化时,需要注意的是不能将一个数组赋给另外一个数组。
2 字符串
字符串是存储在内存的连续字节中的一系列字符,也可以看做是由字符构成的字符数组。C++在处理字符串的时候,可以使用两种模式,一种为C-风格字符串,另外一种是基于string类库。
2.1 C-风格字符串
C-风格字符串具有一种特殊的性质:以空字符结尾,即\0,用来标记字符串的结尾。例如
#include<iostream>
using namespace std;
int main()
{
char array1[] = { 'b','e','a','u','t','i' };
char array2[] = { 'b','e','a','u','t','i' ,'\0' };
cout << "print array1: "<<array1 << endl;
cout << "print array2: "<<array2 << endl;
return 0;
}
我们可以从打印结果可以发现,字符串数组array1除了初始化那些字符外,还存在着一些乱码,而array2只打印了字符’\0’之前的字符。通过这种方式来进行字符串初始化时,应当添加结束字符串在后面,可以看出空字符对C-风格字符串至关重要。
以逐字符的形式来初始化字符串需要大量的使用单引号,且必须加上空字符,这就使得字符串的初始化变得冗长乏味。在C++语言中,可以通过双引号的形式来对字符串进行初始化,该模式不需要加上空字符串来表示字符串的结束。这种用双引号括起来的字符串初始化模式已经隐式地包括字符串的结尾空字符,因此不需要显示地包含它。例如
char bird[] = "Nr. Cheeps"
char fish[] = "Bubbles"
在存储字符串时,需要注意一点的是:字符串存储所需的最短数组大小必须包含结尾的空字符。
通常情况下,可以使用strlen()函数来计算存储在数组中字符串的长度,strlen()函数只计算可见的字符,并没有将空字符计算在内。在C++程序中引言strlen()函数时需要添加标准头文件cstring。例如
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char array1[] = { 'b','e','a','u','t','i' ,'\0' };
char array2[] = "Bubbles";
cout << "the size of array1: " << strlen(array1) << endl;
cout << "the size of array2: " << strlen(array2) << endl;
return 0;
}
执行结果
the size of array1: 6
the size of array2: 7
在输入字符串的过程中会面临着空格的输入,如果只是简单的使用cin来输入字符串,则出现输入字符串的不完整,主要是由于cin使用空白(空格、制表符和换行符)来确定字符串的结束位置。例如:
#include<iostream>
using namespace std;
int main()
{
const int ArSize = 20;
char name[ArSize];
cout << "Enter your name:\n";
cin >> name;
cout << "Your name is: " << name << endl;
return 0;
}
执行结果:
在C++中,可以通过getline()和get()两种方式来解决。
getline()函数读取整行,它通过回车键输入的换行符来确定输入的结尾,其调用方法为:
cin.getline(charName, charSize) // charName---字符串名字,charSize-----读取的字符串数目``
get()函数也是读取整行,其格式为
cin.get(name, ArSize)
cin.get(name, ArSize).get()
get与getline的区别: getline会在读取结束后舍弃换行符,而get会将换行符保留到输入序列中。
2.2 string类
string类是C++标准库的重要部分,主要应用于字符串处理,可以使用输入输出流方式直接进行string操作。string对象和字符数组之间的区别在于可以将string对象声明为简单变量,而不是数组。例如
string str1;
string str2 = "boy"
在数组中,不能将一个数组赋给另外一个数组,但是string对象可以实现将一个string对象赋给另外一个string对象。string类也简化了字符串合并操作,可以直接使用运算符+将两个string对象合并起来,还可以使用+=将字符串附加到另外一个string对象后面。例如
string str1 = "I love ";
string str2 = "basketball"
string str3;
str3 = str1 + str2;
str1 += str2;