1.利用cin、cin.get()
和cin.getline()
輸入字符串的區(qū)別
iostream
中的類cin
提供了一些面向行的成員函數(shù):get()和getline()
蚌讼。
-
cin
cin
使用空白(空格个榕、制表符和換行符)作為字符串的結(jié)束位置,這表明cin
只能讀取輸入隊列中的一個單詞凰萨。 -
cin.getline()
cin.getline()
讀取整行械馆,使用enter鍵入的回車符確定讀取結(jié)束位置,該函數(shù)有兩個參數(shù)瘦材,第一個參數(shù)為用于存儲字符的數(shù)組仿畸,第二個參數(shù)為字符數(shù)組的長度。cin.getline()
在讀取的字符數(shù)目達到第二個參數(shù)值時或者遇到換行符時停止讀取簿晓。丟棄換行符補充\0
在字符串尾部千埃。 -
get()
這個方法有幾種形式。討論其中兩種谒臼,第一種形式與getline()
相似耀里,有兩個輸入?yún)?shù),都讀取到行尾底哥,但與getline()
不同的是房官,這種方法不再讀取并丟棄換行符,而是將其留在隊列中孵奶。第二種形式無參蜡峰,讀取一個字符(即使是換行符),可以這種方式來處理換行符早像,為下一行輸入做準(zhǔn)備肖爵。
例:
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;
運行結(jié)果
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的成員方法灌诅,傳入的參數(shù)為字符串指針和字符的限制
*/
cin.getline(ch,20);
/*
**此處含末,getline()為類istream的成員方法佣盒,傳入的參數(shù)為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;
- 結(jié)構(gòu)體
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;
- 結(jié)構(gòu)體中成員可以為類(如
string
),可以創(chuàng)建數(shù)組(類似基本數(shù)據(jù)類型數(shù)組的創(chuàng)建方法) - 共用體(union)
共用體是一種數(shù)據(jù)格式,可以存儲不同的數(shù)據(jù)類型蚪燕。但只能同時存儲其中的一種類型奔浅。假如結(jié)構(gòu)體只能同時存儲int
和double
,共用體則只能存儲一種鲁驶,int
或double
舞骆。
定義:
union num{
int n;
double m;
};
在不同的時間可以存儲不同類型的數(shù)據(jù),如:
num ID;
ID.n = 12;
//restore int and double in difference time
cout << ID.n << endl;
ID.m = 12.12;
cout << ID.m << endl;
- 數(shù)組的替代品
1.模板類vecter
模板類vecter類似于string類脆霎,也是一種動態(tài)數(shù)組狈惫。可在運行階段設(shè)置vecter長度忆肾,可在末尾附加新數(shù)據(jù)菱肖,可在中間加入新數(shù)據(jù)〕≈伲可以說它是用new和delete來處理動態(tài)數(shù)組的替代品。創(chuàng)建一個名為vt的vecter對象且可存儲類型為typeName的定義方式為:
vecter<typeName> vt(elem)
2.1.模板類array
vecter功能強大摹闽,但是效率低褐健。如果需要固定長度的數(shù)組澜汤。可以使用模板類array俊抵,array對象的長度是固定的徽诲。創(chuàng)建一個名為arr的array對象,它包含n_elem個類型為typeName的元素:
vecter<typeName,n_elem> arr
- new和delete
使用指針時谎替,一定要首先對指針初始化钱贯,下述做法不可為:
//指針a指向何處,不得而知
int *a;
*a = 1;
c++引入了關(guān)鍵字來克服這種問題秩命,提供了一種可以繞過定義變量而直接通過指針操作數(shù)據(jù)的方法弃锐,即通過new關(guān)鍵字為指定類型的數(shù)據(jù)分配內(nèi)存(c中為molloc()函數(shù)),并提供一個指向該存儲單元的指針霹菊。其格式為:
typeName *pointerName = new typeName
例如:
//使用解引用(*)指針是浇辜,一定要對指針初始話
//使用new關(guān)鍵字尋求一個適合存儲int數(shù)據(jù)的內(nèi)存
int *p = new int;
值得注意的是,通過new關(guān)鍵字是從堆(heap)或自由空間(free store)中獲取存儲單元待诅;而直接定義的變量是從棧(stack)中獲取存儲單元熊镣。
new一定要和delete配合使用募书,使用delete可以釋放被定義是分配的存儲空間测蹲,但不會刪除指針本身。如:
int *p = new int;
delete p;
1.使用new創(chuàng)建動態(tài)數(shù)組
typeName *pointerName = new typeName[element_num]
使用delete刪除動態(tài)數(shù)組
delete [] pointerName
2.創(chuàng)建結(jié)構(gòu)體的兩種方式
struct infinite {
int a;
float b;
};
//第一種初始化結(jié)構(gòu)體的方式篮赢,需要在定義時初始化
infinite first = {1,1.2};
infinite first { 1, 1.2 };
//訪問方式,利用操作符“.”訪問成員
int a = first.a;
float b = first.b;
//第2種動態(tài)初始化結(jié)構(gòu)體的方式启泣,不用在定義時初始化示辈,利用指針指向該存儲空間,操作符“->”訪問成員
infinite *second = new infinite;
second->a = 1;
second->b = 1.2;