一、数组
数组(array)是一种数据格式,能存储多个同类型的值
short months[12];
1.组成部分
- 存储在每个元素中的值的类型
- 数组名
- 数组中的元素数
【1】数组中的元素不能是变量
【2】此时,months的类型不是“数组”,而是“short数组”
2.初始化
int cards[4]={3,6,8,10};
int hand[4];
hand[4]={5,6,7,9};//不允许
- 只有在定义数组时才能使用初始化,此后就不能使用了
- 不能将一个数组赋给另一个数组
long totals[500]={5.0,2.5};
short things[]={1,5,3,8};
- 如果只对数组的一部分进行初始化,则编译器把其他元素设置为0
- 如果初始化数组时方括号([ ])为空,则编译器将计算元素个数
int earnings[4]{1,2,3,4};
int x[10]={};
- 进行初始化时,可以不用等号
- 可不再大括号内包含任何东西,这将把所有元素都设置为0
二、字符串
通常,C++处理字符串的方式有两种。第一种来自C语言,常被称为C风格字符串。另一种,基于string类库的方法
1.利用char数组存储字符
char dog[8]={'b','e','a','u','x',' ','i','i'};
char cat[8]={'f','a','t','e','s','s','a','\0'};
- C风格字符串的特殊性质:以空字符\0结尾,其ASCII码为0
- 上例中,两个数组都是char数组,但只有第二个是字符串
- C++中有许多处理字符的函数,包括cout使用的那些函数,它们逐个地处理字符串中的字符,直到到达空字符为止
更好的方法:
使用一个引号括起的字符串即可
char bird[11]="Mr.Cheeps.";
char fish[]="Bubbles";
- 用引号括起的字符串隐式地包括结尾的字符
- 字符串常量(使用双引号)不能与字符常量(使用单引号)互换
注意区别:
char shirt_size='s';
char shirt_size="s";
- 字符常量(如‘S’)是字符串编码的简写表示,在ASCII系统上,‘S’只是83的另一种写法,因此将83赋给shirt_size
- “s”不是字符常量,它表示的是两个字符(字符S和\0)组成的字符串,实际上,上述代码中,“s”表示的是字符串所在的内存地址
2.在数组中使用字符
将字符串存储到数组中,通常有两种方法:
1.将数组初始化为字符串常量
2.将键盘或文件输入读到数组中
#include<iostream>
#include<cstring>
char name1[15];
char name2[15]="C++owboy";
cout<<"hello!"<<name2;
cout<<"what's your name?\n";
cin>>name1;
cout<<strlen(name1)<<" "<<sizeof(name1);
- sizeof运算出整个数组的长度
- strlen返回的是存储在数组中的字符串的长度,即只计算可见的字符,不把空字符计算在内
- 若需要修改程序以使用不同的数组长度时,只需要在定义符号常量的地方修改即可
3.字符串输入
cin输入
利用cin(),每次只能读取一个单词:
char name[20];
char dessert[size];
cout<<"enter your name\n";
cin>>name;
cout<<"enter your favorite dessert\n";
cin>>dessert;
cout<<"I have some ""<<dessert;
cout<<"for you."<<name;
- 若输入单词,如name,程序正常运行不会出错
- 若输入多个单词以空格隔开,则会出现问题,因为cin使用空白(空格、制表符和换行符)来确定字符串的结束位置:如上述程序中,输入abc xyz时,系统会把abc作为第一个字符串,将它放到name数组中,结果输出name为abc xyz;xyz则被留在输入队列中,当cin在输入附列中搜索用户喜欢的甜点时,发现了xyz,因此cin读取xyz,并将其存放在dessert中
getline()输入
geiline读取一行输入,直到达到换行符
char name[20];
char dessert[20];
cout<<"enter your name\n";
cin.getline>>(name,20);
cout<<"enter your favorite dessert\n";
cin.getline>>(dessert,20);
cout<<"I have some ""<<dessert;
cout<<"for you."<<name;
- 上述更改的代码的意义为:将姓名读入到一个包含20个元素的name数组中
get()输入
get()与getline()作用相似,但get不再读取并丢弃换行符,而是将其留在输入队列中
#include<iostream>
using namespace std;
int main()
{
char name[20];
char dessert[20];
cin.get(name,20);
cin.get(dessert,20);
}
- 由于第一次调用后,换行符留在输入队列中,因此第二次调用时看到的第一个字符便是换行符,此时get()认为已到达行尾,第二次无法输入
- 在两次cin.get输入的代码中间加入cin.get()可解决这一问题
4.混合输入字符串和数字
#include<iostream>
using namespace std;
int main()
{
cout<<"what year was your house built?\n";
int year;
cin>>year;
cout<<"what is its streer address?\n";
char address[80];
cin.getline(address,80);
}
- 此程序运行时,用户根本没有输入地址的机会
- 当cin读取年份时,同之前说过的cin输入的情况一样,回车键的换行符留在输入队列中,后面的cin.getline看到换行符之后认为是一个空行,并将一个空字符串赋给address
- 在cin后加上一行代码cin.get()解决此问题,或直接合并写成(cin>>year).get()
三、string类
string类使用起来比数组简单,同时提供了将字符串作为一种数据类型的表示方法
#include<string>
string str1;
string str2="abcdefg";
cin>>str1;
string str3;
str3=str1+str2;
cout<<str2[2]<<endl;
strcpy(str1,str2)//复制操作
strcat(str1,str2)//拼接操作
- 使用string对象的方式与使用字符数组相同:可初始化、输入存储、显示、访问string对象
- string对象和字符数组之间的主要区别是,可以将string对象声明为简单变量,而不是数组
- 不能将一个数组赋给另一个数组,但可以将一个string对象赋给另一个string对象str1=str2
- string类简化了字符串合并操作