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均可以用访问数组方式进行访问,即[]