C++面向行輸入:get()與getline()
面向行的輸入:get()與getline()
引入:
char a = 's';//這樣的語句合法
char b = "s";//不合法
/*
"S"不是字符常量,他表示兩個字符(S和\0)組成的字符串。
並且"S"表示的的是字符串所在的內存地址,相當於將一個內存地址賦給b
*/
cin使用空格、製表符、換行符來確定字符串的結束位置,這意味着cin在獲取字符數組時只讀取一個單詞。讀取該單詞後,cin將該字符串放到該數組中,並自動在結尾添加空字符。
e.g.
char a[30];
char b[30];
cin>>a;
cin>>b;
當你輸入
word1 word2
並敲下回車,cin>>a在word1後檢測到空格結束
但程序不會再提示你要輸入b
程序把word2留在輸入隊列中,當cin在輸入隊列中搜索時,發現了word2,cin讀取word2並將它放在b數組中
getline()
- 讀取整行
- 通過回車鍵輸入的換行符來確定輸入結尾
- 可以使用cin.getline() 該函數有兩個參數,第一個參數是用來儲存輸入行的數組名稱,第二個參數是要讀取的字符數(如果這個數是20,則函數最多讀取19個字符,餘下的空間用於存儲自動在結尾處添加的空字符)。
- getline()成員函數在讀取指定數目的字符或遇到換行符時停止讀取
- !每次讀取一行,通過換行符來確定行尾,但不保存換行符,相反,在存儲字符串時,用空字符來替換換行符!
get()
-
讀取整行(同getline())
-
通過回車鍵輸入的換行符來確定輸入結尾(同getline())
-
可以使用cin.get() 與getline()函數接收的參數相同,解釋參數的方式也相同。並且都讀取到行尾
-
!但是,get不再讀取並丟棄換行符,而是將其留在輸入隊列中!
-
解決方法:
- 可以用不帶參數的get()函數來處理換行符
cin.get(name,ArSize); cin.get(); cin.get(dessert,ArSize);
- 將兩個類成員拼接起來
cin.get(name,ArSize).get();
可以這樣操作是因為
cin.get(name,ArSize)
返回一個cin對象,該對象隨後被用來調用get()函數- 同樣,可以把輸入中連續的兩行分別讀入兩個數組中
cin.getline(name1,ArSize).getline(name2,ArSize);
-
差異
-
為什麼有時候用get而不用getline呢?
老式實現沒有getline(),其次get()使輸入更仔細
getline()使用起來簡單一些,但get()使得檢查錯誤更簡單些
-
如何判斷get是因為讀取了整行而停止還是因為數組已填滿?
查看下一個字符,如果是換行符,說明已讀取了整行輸入,否則,該行中還有其他輸入
可能出現問題
-
空行
這兩種函數的下一條輸入語句將在上一次結束讀取的位置開始讀取
get()讀取空行後設置失效位時,意味着接下來的輸入將被阻斷,但可以用cin.clear()命令來恢復輸入
-
輸入的字符串可能比分配的空間長
如果輸入行包含的比指定的多,則兩種函數會把餘下的字符留在輸入隊列中,而getline()還會設置失效位,並關閉後面的輸入
-
混合輸入數字和字符串導致的問題
cin輸入一個數字類型,按下回車時,換行符留在了輸入隊列,下一次被getline()等看到換行符,將認為是一個空行,直接賦給數組
解決方法是讀取地址之前丟棄換行符
可以用(cin>>year).get()或者cin>>year;get();