C++ Primer Plus学习笔记(二)复合类型

1面向行输入字符串

1.1cin.getline cin.get

cin.getline(array,n) cin.get(array,n)用于读取面向行输入的字符串,相比cin>>而言,其不会被空格键间断

基本介绍

char a[20]
cin>>a;//假如a为 abc def,则a接收到的字符串为abc
cin.getline(a,10);
cin.get(a,10);

区别

cin.getline()读取换行符并将其丢弃,cin.get()不丢弃,而将其保存在输入缓冲队列中。

char a[10];
char b[10];
cin.getline(a,10);
cin.getline(b,10);

cin.get(a,10);
cin.get();//读取换行符,将第一个字符串末尾换行符跳过
cin.get(b,10);

混合输入字符串和数字时会出错

int year;
char name[20];
cin>>year;
cin.getline(name,20);

此时读取不到name字符串,因为year末尾的换行符会被读取
采用的措施是在cin>>year后面加一个cin.get();

注:在输入一个数字之后回车,缓冲区指针会停在回车符之前,导致下一次的读取会读取到一个空字符串
cin读取char值时,与读取其他类型一样(int float),会自动忽略空格和换行符,并且在按下回车后键盘输入内容才会发送给程序

char ch;
cin>> ch;
while(ch!='#')
{
    cout << ch;
    cin >> ch;
}
char b[10];
cin >> b;
cout << "b:" << b << endl;
//若输入ch序列为a b c d#sde,则输出的ch序列为abcd(无空格),输出的b数组为sde(尽管在#后面,但其被保存在输入缓冲区中)

1.2 string

string读取时,可以直接用cin>>,但是若有空格存在时,会间断字符串,采用的措施为

string a;
getline(cin,a);//区别于cin.getline(字符数组,n),
//原因是此时getline不是istream类的方法,istream有针对基本类型int、double、char等类型的方法

2.创建动态结构

使用new分配内存,返回该内存块地址
使用delete释放内存

int* p1 = new int;
delete p1;
struct t1{};
t1* p2 = new t1;
delete p2;
//使用new创建动态数组
int* p3 = new int[10];
delete [] p3;

注意,

char name[20]="haozhang";
char *p1;
p1 = name;//此时将字符数组地址赋给p1

ps = new char[strlen(name)+1];
strcpy(ps,name);//此时不能直接将name用=赋给ps
//因为这样只会修改存在ps里的地址,程序不能访问新分配的内存

3. 指向结构体的指针

通常,访问结构体成员可以使用.,但是若指针指向结构体,应当使用->。

struct t1{
    int age;
    string name;
};
t1 t2;
t1* p = &t2;
p->age = 1;
(*p).name="abc";

4. vector array

vector 和 array 是数组替代品

4.1 典型用法

vector <typename> vt(n_elem);//n_elem可以为变量
array <typename,n_elem>

4.2 对比区别

vetor不能用{}进行初始化,而array可以
array与数组区别在于,array可以变量间相互赋值,如下:

array<double,4>a1={1,2,3,4};
array<double,4>a2;
a2 = a1;

vector和array均可以用访问数组方式进行访问,即[]

猜你喜欢

转载自blog.csdn.net/yanrong1095/article/details/80467548