C++ 每次讀取一行字串輸入
istream中的類(如cin)提供了一些面向行的類成員函式:getline()和get()。這兩個函式都讀取一行輸入,直到到達換行符。
getline()和get()函式不同的是:getline()將丟棄換行符,而get()將換行符保留在輸入序列中
#######################################################################3
1.面向行的輸入:getline()
getline()函式讀取整行,它使用通過回車鍵輸入的換行符來確定輸入結尾
呼叫方式:cin.getline();
該函式有兩個引數,第一個引數用來儲存輸入行的陣列的名稱,第二個引數是要讀取的字元數。
例如,假設要使用getline()將姓名讀入到一個包含20個元素的name陣列中。可以使用這樣的函式呼叫:
cin.getline(name, 20);
這將把一行讀入到name陣列中--如果這行包含的字元不超過19個。(getline()成員函式還可以接受第三個可選引數)
void instr(void) { const int ArSize=20; char name[ArSize]; char dessert[ArSize]; cout<<"Enter your name:\n"; cin.getline(name, ArSize);//reads through newline cout<<"Enter your facorite dessert:\n"; cin.getline(dessert, ArSize); cout<<"I have some delicious "<<dessert; cout<<" for you, "<<name<<".\n"; cin.get(); }
#########################################################3
2.面向行的輸入:get()
get()有集中變體
(1).該函式有兩個引數,第一個引數用來儲存輸入行的陣列的名稱,第二個引數是要讀取的字元數。這種變體的工作方式和getline()類似,但get()並不丟棄換行符,而是將其留在輸入佇列中。
例如,假設我們連續兩次呼叫get():
cin.get(name, ArSize);
cin.get(dessert, ArSize);
由於第一個呼叫後,換行符將留在輸入佇列中,因此第二次呼叫時看到的第一個字元便是換行符。因此get()認為已到達行尾,而沒有讀取任何可讀取的內容。如果不借助於幫助,get()將不能跨過該換行符。
(2).get()有另一種變體,不帶任何引數。該變體的功能是讀取下一個字元(即使是換行符),因此可以用它來處理換行符,為讀取下一個輸入做好準備。故可採用下面的呼叫序列:
cin.get(name, ArSize); //read first line
cin.get(); //read newline
cin.get(dessert, ArSize);//read second line
還有一種使用get()的方式是將兩個類成員函式拼接起來(合併),如下:
cin.get(name, ArSize).get();//concatenate member function
因為cin.get(name, ArSize)返回一個cin物件,該物件隨後將被用來呼叫get()函式。
void instr2(void)
{
const int ArSize=20;
char name[ArSize];
char dessert[ArSize];
cout<<"Enter your name:\n";
cin.get(name, ArSize).get();//reads through newline
cout<<"Enter your facorite dessert:\n";
cin.get(dessert, ArSize).get();
cout<<"I have some delicious "<<dessert;
cout<<" for you, "<<name<<".\n";
cin.get();
}
#################################################
總之,getline()使用起來簡單一些,但get()使得檢查錯誤更簡單些