C++中cin.getline()和cin.ignore()函數

getline()函數:

getline()函數是一個比較常見的函數。根據名字直接望文生義,就知道這個函數是來完成讀入一行數據。

getline是C++標準庫函數;但不是C標準庫函數,getline會生成一個包含一串從輸入流讀入的字符的字符串,直到以下情況發生會導致生成的此字符串結束。1)到文件結束,2)遇到函數的定界符,3)輸入達到最大限度。

在C++中本質上有兩種getline函數:

第一種:在頭文件<istream>中,是iostream類的成員函數。

第二種:在頭文件<string>中,是普通函數。

 

第一種: 在<istream>中的getline()函數有兩種重載形式:

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

作用是: 從istream中讀取至多n個字符(包含結束標記符)保存在s對應的數組中。即使還沒讀夠n個字符,

如果遇到delim 或 字數達到限制,則讀取終止,delim都不會被保存進s對應的數組中。

 

第二種: 在<string>中的getline函數有四種重載形式:

istream& getline (istream&  is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream&  is, string& str);

istream& getline (istream&& is, string& str);
用法和上第一種類似,但是讀取的istream是作爲參數is傳進函數的。讀取的字符串保存在string類型的str中。

函數的變量:

is    :表示一個輸入流,例如 cin。

str   :string類型的引用,用來存儲輸入流中的流信息。

delim :char類型的變量,所設置的截斷字符;在不自定義設置的情況下,遇到’\n’,則終止輸入。

 

當 cin 讀取數據時,它會傳遞並忽略任何前導白色空格字符(空格、製表符或換行符)。一旦它接觸到第一個非空格字符即開始閱讀,當它讀取到下一個空白字符時,它將停止讀取。而getline可讀取整行,包括前導和嵌入的空格,並將其存儲在字符串對象中。

測試代碼:

#define _CRT_SECURE_NO_WARNINGS
#include "iostream"

using namespace std;

int main()
{
	char name[32];
	char sex[15];
	
	cout << "enter your name:";
	cin >> name;

	cout << "enter your sex";
	cin >> sex;
	
	cout << "name:" << name << " " << "sex:" << sex << endl;
	system("pause");	
	return 0;
}	

 

運行結果:

 

我們使用getline就會避免這種問題:

#define _CRT_SECURE_NO_WARNINGS
#include "iostream"

using namespace std;

int main()
{
	char name[32];
	char sex[15];
	
	cout << "enter your name:";
	//cin >> name;
	cin.getline(name, 32);

	cout << "enter your sex";
	//cin >> sex;
	cin.getline(sex, 10);
	
	cout<<"name:"<<name<<" "<<"sex:"<<sex<<endl;
	system("pause");	
	return 0;
}	

 

 

運行結果:

 

ignore()函數:

cin.ignore 是從輸入流(cin)中提取一定數目的字符並把提取的字符忽略(ignore)

  1. cin.ignore(n,c)  //從輸入流cin中提取n個字符或遇到c停止,並忽略之前的字符;

  2. cin.ignore(num) //從輸入流cin中提取n個字符,輸入的字符數量一般要大於num

cin.ignore常用功能:清除以回車結束的輸入緩衝區的內容,消除上一次輸入對下一次輸入的影響。

  1. cin.ignore(1024,'\n'); //把第一個參數設置足夠大,在這個範圍內讀取到 回車 後,把回車前面輸入流的字符連同回車一同清除

  2. cin.clear();

使用cin.ignore()也可以解決上面的問題:

#define _CRT_SECURE_NO_WARNINGS
#include "iostream"

using namespace std;

int main()
{
	char name[32];
	char sex[15];

	cout << "enter your name:";
	cin >> name;
	
	cout << "enter your sex";
	cin.ignore(32, '\n');
	cin >> sex;
	
	cout << "name:" << name << " " << "sex:" << sex << endl;
	system("pause");
	return 0;
}

 

 

運行結果:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章