1.数组
通过程序分析数组的使用:
#include<iostream>
int main()
{
using namespace std;
int yams[3] = { 7,8,6 }; //数组的声明和初始化
int yamscost[3]; //数组的声明
yamscost[0] = 20;
yamscost[1] = 30;
yamscost[2] = 5;
cout << "Total yams = "
<< yams[0] + yams[1] + yams[2]<<endl;
cout << "The package with "
<< yams[1]
<< " yams costs "
<< yamscost[1]
<< " cents per yam.\n"
<< "The total yam expense is "
<< yamscost[0]*yams[0] + yamscost[1]*yams[1] + yamscost[2]*yams[2]
<< " cents.\n" << endl;
cout << "Size of yams ayyay = "
<< sizeof(yams)
<< " bytes.\n"
<< "size of one element = "
<< sizeof(yams[0])
<< " bytes.";
return 0;
}
1.数组的声明:
typeName arrayName[arraySize]
arraySize 必须是整型常数(例如10)或者const值,也可以是常量表达式(8*sizeof(int)),不可以是变量;数组下标从0开始;编译器编译不会检查下标溢出或错误。
2.数组的初始化:
C++允许在声明语句中初始化数组元素,同C语言,如果没有初始化则表明数组中元素的值是不确定的,初始化数量可以小于数组中元素数量,编译器会自动设置为0,均同C语言,也可以不设置数组的大小,让编译器根据初始化数组的值自己确定大小。
只有在数组声明时才可以初始化,否则就要使用下标分别给数组中元素赋值。
C++11数组初始化方法:
①省略掉等号: double earnings[4] {1,2,3,4};
②均初始化为0: doublle earnings[4]{ };
③不允许缩窄:
long plifs[] = { 23,45,3.0 }; //编译错误,因为将3.0浮点型缩减为整型,这是不允许的
char slifs[4]{ 'h','i',1122011,'\0' };//编译错误,1122011超过了char范围
char tlifs[4]{ 'h','i',112,'\0' };//编译正确,因为112在char的范围中
2.字符串——C风格字符串
①介绍:
字符串被存储在char数组中,并且以空字符为结尾的字符数组才是字符串;也可以初始化时用双引号引起来来初始化字符串,这种字符串被称为字符串常量或字符串字面值,括起来的字符串隐式包括空字符,一定要确保数组足够大,一般采用编译器自动确定数组大小;字符串中的字符实际上表示的是字符串所在的地址(C++中不允许通过字符串数组来使用地址值,因为地址在C++中是一种独立的变量),与字符不同,字符存储的是ascii码值,本质还是int数据。
②在数组中使用字符串
#include<iostream>
int main()
{
using namespace std;
const int Size = 15;
char name1[Size];
char name2[] = "C++ owboy"; //字符串常量初始化
cout << "Howdy! I'm "
<< name2
<< "! What's your name?" << endl;
cin >> name1; //字符串键盘输入初始化
cout << "Well,"
<< name1
<< ",your name has "
<< strlen(name1)
<< " letters and is stored in an array of "
<< sizeof(name1)
<< " bytes.\n";
cout << "Your initial is "
<< name1[0]
<< "." << endl;
cout << "Here are the first 3 characters of my name:"
<< name2[0]
<< name2[1]
<< name2[2]; //通过索引找到数组中的字符
//也可以有另一种办法
// name2[3]='\0';
//cout<<name2;
return 0;
}
2.1拼接字符串常量:
任何由两个空白(空格 制表 换行符)分隔开的字符串常量都将自动拼接成一个,在拼接时不会考虑在被连接的字符串后边添加空格,并且第一个字符串的空白符会被第二个字符串的第一个字符取代。
2.2数组中使用字符串:
将字符串存储到数组中最常用的方法:将数组初始化为字符串常量 或者通过键盘或文件输入读入到数组。
该程序使用符号常量来指定数组的长度,使用符号常量来表示数组长度,当需要修改程序以使用不同的数组长度时,会比较方便——只需要在定义符号常量的地方进行修改就好。
2.3字符串输入——一行字符串输入
对于上边的程序,cin使用空白来确定字符串的结束位置,所以当我们输入名字为abc def时,仅会显示名字为abc,如何解决这个问题呢?
①每次读取一行字符串输入:
istream中的类(cin)提供了一些面向行的类成员函数:getline()和get().
getline():
getline(存储行的数组名称,要读取的字符数)——cin.getline(name,20)
getline()函数读取一行输入,直到遇到换行符,随后getline()将丢弃换行符,会用空字符来代替换行符原来的位置。
get():
get(存储行的数组名称,要读取的字符数)——cin.get(name,20)
get()并不丢弃换行符,而是将换行符留在输入队列中,这会导致空行问题。
②空行问题
当get()或getline()读取空行时,get()读取空行后将设置失效位,这意味着接下来的输入将被阻断,使用cin.clear()恢复输入;
另一个潜在问题是:如果输入字符多于指定的字符,两个函数均会将余下的字符留在队列里,getline()会设置失效位,并关闭后边的输入。
如果连续两次使用get()函数,那么第二句的get()函数什么都得不到,因为它会读取输入队列中被第一个get函数留在队列中的换行符,这导致第二句输入会读取到一个空行,如何解决该问题呢,使用get()将空格单独读取即可。
③get()函数的合并
cin.get(name,Size)返回一个cin对象,因此还可以调用get函数。
cin.get(name1,Size1).get(name2,size2);
cin.getline(name1,size1).getline(name2,size2);
2.3字符串输入——混合输入字符串和数字
#include<iostream>
int main()
{
using namespace std;
int year = 0;
cout << "What year was your house built?\n";
cin >> year;
char address[50]{};
cout << "What is its street address?\n";
cin.getline(address, 49);
cout << "Year bulit: "
<< year << " ." << endl
<< "address: "
<< address << "." << endl
<< "Done!";
return 0;
}
问题:cin读取年份时,换行符留在输入队列里,导致后边的cin.getline()读取到一个空行,所以要处理掉被留在队列里的换行符,在输入数字后加入cin.get()来读取换行符,或者(cin>>year).get()来读取换行符。
3.string类简介——利用string类来处理数组,更加简单方便
①介绍
要使用string类,必须包含string的头文件,string类隐藏了字符串的数组性质,能够像处理普通变量那样处理字符串。
#include<iostream>
#include<string> //包含该头文件
int main()
{
using namespace std;
char charr1[20];
char charr2[20] = "abcdefg"; //C风格来初始化
string str1;
string str2 = "hijklmn";
cout << "Enter a kind of feline:";
cin