面向行的輸入: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()
- 讀取整行
- 通過Enter鍵輸入的換行符來確定輸入結尾
- 可以使用cin.getline() 該函式有兩個引數,第一個引數是用來儲存輸入行的陣列名稱,第二個引數是要讀取的字元數(如果這個數是20,則函式最多讀取19個字元,餘下的空間用於儲存自動在結尾處新增的空字元)。
- getline()成員函式在讀取指定數目的字元或遇到換行符時停止讀取
- !每次讀取一行,通過換行符來確定行尾,但不儲存換行符,相反,在儲存字串時,用空字元來替換換行符!
get()
-
讀取整行(同getline())
-
通過Enter鍵輸入的換行符來確定輸入結尾(同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();