1. 程式人生 > >C++ 每次讀取一行字串輸入

C++ 每次讀取一行字串輸入

istream中的類(如cin)提供了一些面向行的類成員函式:getline()和get()。這兩個函式都讀取一行輸入,直到到達換行符。

getline()和get()函式不同的是:getline()將丟棄換行符,而get()將換行符保留在輸入序列中

#######################################################################3

1.面向行的輸入:getline()

getline()函式讀取整行,它使用通過回車鍵輸入的換行符來確定輸入結尾

呼叫方式:cin.getline();

該函式有兩個引數,第一個引數用來儲存輸入行的陣列的名稱,第二個引數是要讀取的字元數。

如果這個引數為20,則函式最多讀取19個字元,餘下的空間用於儲存自動在結尾處新增的空字元。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()使得檢查錯誤更簡單些