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);
      

差異

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

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

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

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

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

可能出現問題

  1. 空行

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

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

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

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

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

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

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

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

Tags: