C++面向行輸入:get()與getline()

Quirkygbl發表於2021-10-10

面向行的輸入: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);
      

差異

  1. 為什麼有時候用get而不用getline呢?

    老式實現沒有getline(),其次get()使輸入更仔細

    getline()使用起來簡單一些,但get()使得檢查錯誤更簡單些

  2. 如何判斷get是因為讀取了整行而停止還是因為陣列已填滿?

    檢視下一個字元,如果是換行符,說明已讀取了整行輸入,否則,該行中還有其他輸入

可能出現問題

  1. 空行

    這兩種函式的下一條輸入語句將在上一次結束讀取的位置開始讀取

    get()讀取空行後設定失效位時,意味著接下來的輸入將被阻斷,但可以用cin.clear()命令來恢復輸入

  2. 輸入的字串可能比分配的空間長

    如果輸入行包含的比指定的多,則兩種函式會把餘下的字元留在輸入佇列中,而getline()還會設定失效位,並關閉後面的輸入

  3. 混合輸入數字和字串導致的問題

    cin輸入一個數字型別,按下回車時,換行符留在了輸入佇列,下一次被getline()等看到換行符,將認為是一個空行,直接賦給陣列

    解決方法是讀取地址之前丟棄換行符

    可以用(cin>>year).get()或者cin>>year;get();

相關文章