C++面向行輸入之get()與getline()實例詳解
引入:
char a = 's';//這樣的語句合法 char b = "s";//不合法 /* "S"不是字符常量,他表示兩個字符(S和\0)組成的字符串。 并且"S"表示的的是字符串所在的內(nèi)存地址,相當(dāng)于將一個內(nèi)存地址賦給b */
cin使用空格、制表符、換行符來確定字符串的結(jié)束位置,這意味著cin在獲取字符數(shù)組時只讀取一個單詞。讀取該單詞后,cin將該字符串放到該數(shù)組中,并自動在結(jié)尾添加空字符。
e.g.
char a[30]; char b[30]; cin>>a; cin>>b;
當(dāng)你輸入
word1 word2
并敲下回車,cin>>a在word1后檢測到空格結(jié)束
但程序不會再提示你要輸入b
程序把word2留在輸入隊列中,當(dāng)cin在輸入隊列中搜索時,發(fā)現(xiàn)了word2,cin讀取word2并將它放在b數(shù)組中
getline()
讀取整行
通過回車鍵輸入的換行符來確定輸入結(jié)尾
可以使用cin.getline() 該函數(shù)有兩個參數(shù),第一個參數(shù)是用來儲存輸入行的數(shù)組名稱,第二個參數(shù)是要讀取的字符數(shù)(如果這個數(shù)是20,則函數(shù)最多讀取19個字符,余下的空間用于存儲自動在結(jié)尾處添加的空字符)。
getline()成員函數(shù)在讀取指定數(shù)目的字符或遇到換行符時停止讀取
!每次讀取一行,通過換行符來確定行尾,但不保存換行符,相反,在存儲字符串時,用空字符來替換換行符!
get()
讀取整行(同getline())
通過回車鍵輸入的換行符來確定輸入結(jié)尾(同getline())
可以使用cin.get() 與getline()函數(shù)接收的參數(shù)相同,解釋參數(shù)的方式也相同。并且都讀取到行尾
!但是,get不再讀取并丟棄換行符,而是將其留在輸入隊列中!
解決方法:
可以用不帶參數(shù)的get()函數(shù)來處理換行符
cin.get(name,ArSize); cin.get(); cin.get(dessert,ArSize);
將兩個類成員拼接起來
cin.get(name,ArSize).get();
可以這樣操作是因為cin.get(name,ArSize)返回一個cin對象,該對象隨后被用來調(diào)用get()函數(shù)
同樣,可以把輸入中連續(xù)的兩行分別讀入兩個數(shù)組中
cin.getline(name1,ArSize).getline(name2,ArSize);
差異
1、為什么有時候用get而不用getline呢?
老式實現(xiàn)沒有g(shù)etline(),其次get()使輸入更仔細(xì)
getline()使用起來簡單一些,但get()使得檢查錯誤更簡單些
2、如何判斷get是因為讀取了整行而停止還是因為數(shù)組已填滿?
查看下一個字符,如果是換行符,說明已讀取了整行輸入,否則,該行中還有其他輸入
可能出現(xiàn)問題
1、空行
這兩種函數(shù)的下一條輸入語句將在上一次結(jié)束讀取的位置開始讀取
get()讀取空行后設(shè)置失效位時,意味著接下來的輸入將被阻斷,但可以用cin.clear()命令來恢復(fù)輸入
2、輸入的字符串可能比分配的空間長
如果輸入行包含的比指定的多,則兩種函數(shù)會把余下的字符留在輸入隊列中,而getline()還會設(shè)置失效位,并關(guān)閉后面的輸入
3、混合輸入數(shù)字和字符串導(dǎo)致的問題
cin輸入一個數(shù)字類型,按下回車時,換行符留在了輸入隊列,下一次被getline()等看到換行符,將認(rèn)為是一個空行,直接賦給數(shù)組
解決方法是讀取地址之前丟棄換行符
可以用(cin>>year).get()或者cin>>year;get();
關(guān)于string使用getline()
C++添加了string類擴(kuò)展了C++庫。因此可以用string類型的變量而不是字符數(shù)組來存儲字符串。要使用string類,必須包含頭文件string。
一般字符數(shù)組和string變量使用getline()方法是不同的。
char a[100]; string str; cin.getline(a,100); getline(cin,str);
cin.getline()這種是句點(diǎn)表示法,函數(shù)getline()是istream類的一個類方法。getline(cin,str)沒有用到句點(diǎn)表示法,這表明這個getline()不是類方法。它將cin作為參數(shù),指出到哪里去查找輸入。另外,也沒有指出字符串的長度,因為string對象會根據(jù)輸入的串的大小自動調(diào)整自身的大小。
為什么第二個getline()不是istream的類方法呢。在引入string類之前很久,C++就有了istream類。因此istream的設(shè)計考慮到了諸如double和int等基本C++數(shù)據(jù)類型,但沒有考慮到string類型,所以string類中,有處理double,int和其他基本類型的類方法,但沒有處理string對象的類方法。
但cin方法也適用與string類對象,這涉及到友元函數(shù),這里先不闡述。
總結(jié)
到此這篇關(guān)于C++面向行輸入之get()與getline()的文章就介紹到這了,更多相關(guān)C++面向行輸入get()與getline()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows?使用ffmpeg?.a靜態(tài)庫讀取Wav音頻并保存PCM的方法
這篇文章主要介紹了windows?使用ffmpeg?.a靜態(tài)庫讀取Wav音頻并保存PCM,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-02-02C++構(gòu)造函數(shù)初始化列表的實現(xiàn)詳解
構(gòu)造函數(shù)主要作用在于創(chuàng)建對象時為對象的成員屬性賦值,構(gòu)造函數(shù)由編譯器自動調(diào)用,無須手動調(diào)用;析構(gòu)函數(shù)主要作用在于對象銷毀前系統(tǒng)自動調(diào)用,執(zhí)行一 些清理工作2022-09-09詳解C++中stoi/stol/stoll函數(shù)的用法
這篇文章主要為大家詳細(xì)介紹了C++中stoi、stol、stoll函數(shù)的具體用法,文中的示例代碼講解詳細(xì),對我們學(xué)校C++有一點(diǎn)的幫助,需要的可以參考一下2023-03-03C++訪問Redis的mset 二進(jìn)制數(shù)據(jù)接口封裝方案
這篇文章主要介紹了C++訪問Redis的mset 二進(jìn)制數(shù)據(jù)接口封裝方案的相關(guān)資料,需要的朋友可以參考下2015-07-07