C++学习之路DAY3—复合类型

一、数组

数组(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类简化了字符串合并操作
上一篇:PYTHON 基础-DAY3/4 20210403


下一篇:redis学习day3