1.利用cin、cin.get()
和cin.getline()
输入字符串的区别
iostream
中的类cin
提供了一些面向行的成员函数:get()和getline()
。
-
cin
cin
使用空白(空格、制表符和换行符)作为字符串的结束位置,这表明cin
只能读取输入队列中的一个单词。 -
cin.getline()
cin.getline()
读取整行,使用enter键入的回车符确定读取结束位置,该函数有两个参数,第一个参数为用于存储字符的数组,第二个参数为字符数组的长度。cin.getline()
在读取的字符数目达到第二个参数值时或者遇到换行符时停止读取。丢弃换行符补充\0
在字符串尾部。 -
get()
这个方法有几种形式。讨论其中两种,第一种形式与getline()
相似,有两个输入参数,都读取到行尾,但与getline()
不同的是,这种方法不再读取并丢弃换行符,而是将其留在队列中。第二种形式无参,读取一个字符(即使是换行符),可以这种方式来处理换行符,为下一行输入做准备。
例:
const int strlen = 20;
char str1[strlen];
char str2[strlen];
cout << "input using cin:";
cin >> str1;
cin >> str2;
cout << "show the output using cin (string 1st):" << str1 << endl;
cout << "show the output using cin(string 2en):" << str2 << endl;
cin.get();//resolve enter
cout << endl;
cout << "input using getline():";
cin.getline(str1,strlen);
cout << "show the output using getline():" << str1 << endl;
cout << endl;
cout << "input using get():";
//execute cin.get(str1, strlen) will return a object,this obiect continue to execute get()
cin.get(str1, strlen).get();
cout << "show the output using get():" << str1 << endl;
运行结果
2.string
类的操作
c++中string
类的操作可以类比Java中string
类的操作,
- 初始化方式:
//use c type
char ch1[] = { "hello" };
char ch2[] {"hello"};
//use c++ type
string str1 = { "hello" };
string str2{ "hello" };
string str3 = "hello";
- 赋值、拼接和附加
//apend string to other string object
str4 = str1 + " world " + str2;
str4 += str3 + " hi! ";
-
string
类的其他操作
strcpy(str1,str2);//copy str2 to str1
strcat(str1,str2);//apending str2 to str1
strlen(str);//length of string object
-
getling()
在两种场合的使用
char ch[20];
string str;
/*
**此处,getline()为类istream中对象cin的成员方法,传入的参数为字符串指针和字符的限制
*/
cin.getline(ch,20);
/*
**此处,getline()为类istream的成员方法,传入的参数为cin对象和string对象
*/
getline(cin, str);
cout << ch << endl;
- 原始字符串
原始字符串即表示字符本身,如\n
就是\n
,而不表示换行。其表达式为:
//语法:strSelf = R“(string object)”
cout << R"(i am a man."\n" instead of endl)" << endl;
- 结构体
struct
定义
struct student {
string name;
int years;
double heigh;
};
初始化
struct student zhang;//c style
student li;//c++ style
c++ style initialized student li
student li = { "dsds", 1994, 173.0 };
student li { "dsds", 1994, 173.0 };
cout << li.name << endl << li.years << endl << li.heigh;
- 结构体中成员可以为类(如
string
),可以创建数组(类似基本数据类型数组的创建方法) - 共用体(union)
共用体是一种数据格式,可以存储不同的数据类型。但只能同时存储其中的一种类型。假如结构体只能同时存储int
和double
,共用体则只能存储一种,int
或double
。
定义:
union num{
int n;
double m;
};
在不同的时间可以存储不同类型的数据,如:
num ID;
ID.n = 12;
//restore int and double in difference time
cout << ID.n << endl;
ID.m = 12.12;
cout << ID.m << endl;
- 数组的替代品
1.模板类vecter
模板类vecter类似于string类,也是一种动态数组。可在运行阶段设置vecter长度,可在末尾附加新数据,可在中间加入新数据。可以说它是用new和delete来处理动态数组的替代品。创建一个名为vt的vecter对象且可存储类型为typeName的定义方式为:
vecter<typeName> vt(elem)
2.1.模板类array
vecter功能强大,但是效率低。如果需要固定长度的数组。可以使用模板类array,array对象的长度是固定的。创建一个名为arr的array对象,它包含n_elem个类型为typeName的元素:
vecter<typeName,n_elem> arr
- new和delete
使用指针时,一定要首先对指针初始化,下述做法不可为:
//指针a指向何处,不得而知
int *a;
*a = 1;
c++引入了关键字来克服这种问题,提供了一种可以绕过定义变量而直接通过指针操作数据的方法,即通过new关键字为指定类型的数据分配内存(c中为molloc()函数),并提供一个指向该存储单元的指针。其格式为:
typeName *pointerName = new typeName
例如:
//使用解引用(*)指针是,一定要对指针初始话
//使用new关键字寻求一个适合存储int数据的内存
int *p = new int;
值得注意的是,通过new关键字是从堆(heap)或自由空间(free store)中获取存储单元;而直接定义的变量是从栈(stack)中获取存储单元。
new一定要和delete配合使用,使用delete可以释放被定义是分配的存储空间,但不会删除指针本身。如:
int *p = new int;
delete p;
1.使用new创建动态数组
typeName *pointerName = new typeName[element_num]
使用delete删除动态数组
delete [] pointerName
2.创建结构体的两种方式
struct infinite {
int a;
float b;
};
//第一种初始化结构体的方式,需要在定义时初始化
infinite first = {1,1.2};
infinite first { 1, 1.2 };
//访问方式,利用操作符“.”访问成员
int a = first.a;
float b = first.b;
//第2种动态初始化结构体的方式,不用在定义时初始化,利用指针指向该存储空间,操作符“->”访问成员
infinite *second = new infinite;
second->a = 1;
second->b = 1.2;
网友评论