string中getline,cin的方法getline(),get總結


一、string中的getline不是string的成員函數,屬於全局函數,使用需要include<string>,有兩個重載版本:

函數原型參見:http://www.cplusplus.com/reference/istream/istream/getline/

標准信息來自《c++primer》和《c++ primer plus》,另http://blog.csdn.net/vanwaals/article/details/5753556

http://blog.csdn.net/mylovepan/article/details/7940719

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

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

這兩個getline讀取cin流里的字符串到str中,直到遇到下列情況結束,並返回:

(a)、遇到文件結束符,如windows下模擬的ctrl+z,或無效輸入

(b)、遇到換行符,即Enter,將換行符留在緩沖區中,留給下一個輸入,並不存入str中,所以輸出str,要自己添加endl來換行

(c)、遇到設備故障

如果第一個字符為換行符,getline也將結束,則str被置為空串。getline函數返回istream引用的對象,和cin一樣也可以用作condition(條件,即有真假的表達式)。

如果輸入的字符串過長呢,會大於str的存儲空間嗎?不會,str自動根據輸入來調整大小。如何結束while(getline(cin,str))循環呢?可以使用ctrl+z

1 #include<iostream>
2 #include<string>
3 using namespace std;
4 int main()
5 {
6 string line;
7 while(getline(cin,line))
8 cout<<line<<"$";
9 }

輸入了三個字符串,每個用Enter結束輸入,且輸出沒有換行,getline()不會忽略space、tab,遇到Enter就結束,那么換行符是否留在緩沖區呢?如果是,下次getline就會遇到該換行符,
導致結束。由於沒有輸入ctrl+z,循環條件一直為真,所以提示繼續輸入
gteline的第三個參數為分界符,用戶可以自定義,任何有效的字符都可以,如#,默認的為Enter。
int main()
{
string s;
while(getline(cin,s,'#'))
cout<<s<<"$";
}

 

二、cin.getline,兩個重載版本:

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

第一個參數為字符指針,第二個控制輸入的最大字符(等於n-1,最后一個位置存'\0',以便把輸入存為字符串),如果輸入的字符串過長,會導致cin流狀態無效

不能再輸入,使用cin.clear()函數可以重設cin的狀態為有效。兩個函數讀取分界符或最大數目的字符為止。注意:將cin.getline()將分界符或者換行符丟棄,即緩沖區不會

有分界符用於下一個輸入。但是如果輸入的字符串過長,余下的字符會留在緩沖區。

int main()
{
char c[4];
cin.getline(c, 4);
cout << c;
}

 

輸入超過了4個字符,存入c的只有三個字符

1 int main()
2 {
3 char c[4];
4 cin.getline(c, 4);
5 cout << c;
6 if (!cin) cout << "cin error" << endl;
7 cin.getline(c, 3);
8 }

 

cin狀態已經無效,!cin為測試條件。所以下一條輸入語句不執行,不再有輸入提示。

int main()
{
char c[4];
cin.getline(c, 4);
cout << c;
if (!cin) cout << "cin error" << endl;
cin.clear();
cin.sync();
cin.getline(c, 3);
cout << c << endl;
}

h

使用cin.clear()與cin.sync()(清空緩沖區),才可以繼續輸入“123”,由於n=3,只能讀取2個字符。

 三、cin.get():

istream& get(char *,int,char); istream& get(char*,int);

用於單字符輸入的 istream& get(char&);int get();

這是個函數都是istream類的方法,需要對象cin才能調用,與string中的getline()不同。

cin.get()與cin.getline()的不同之處為:遇到換行符或分界符,get會留該字符在緩沖區,所以cin.get()的連續兩次調用,后一次會讀取緩沖區的字符,不會再請求輸入。

char c[6];
char a[6];
cin.get(c,5);
cin.get(a,4);

這樣cin.get()無法跨行輸入,解決辦法是使用get的變體,下面介紹兩個新get函數:

istream &get(char&);int get();

第二個函數與c的庫函數getchar()一樣,可以替換后者;它的使用代碼為:

char ch;
ch=cin.get();
while(ch !='\n')
{
cout<<ch;
ch=cin.get();
}

  

這兩個get都用於單字符的輸入,且space,tab,Enter都能輸入。通過在cin.get(c,5)與cin.get(a,4)間插入cin.get()這條語句,讀取了緩沖區的換行符,cin.get(a,4)

才能繼續讀取輸入。

istream &get(char&)的使用方式為 char ch; cin.get(ch);由於返回的是istream對象,所以cinget(ch).get(ch2)>>c3運行正常。也可以用cin.get(ch)為循環的測試條件。

四、cin的特點

cin用於輸入int ,char ,string 等基本類型,不能輸入一行字符到str中。cin遇到space,tab,Enter會自動忽略,從緩沖區中丟棄,但是后續的輸入會留在緩沖區,下一次的輸入會直接從緩沖區讀取數據。

int sum=0;
int n;
while(cin>>n,n!=20)
{
sum+=n;
}
cout<<sum<<endl;

  

換行輸入space后又輸入6,3,4,但是循環無法結束,此時輸入20可以結束。

 1+2+3+4+5+6+3+4=28。注意:while(cin>>a,a!=20)的測試條件是逗號表達式,值為逗號右邊的子表達式,而不是cin>>a的返回值cin。

注意:如果int a;cin>>a;輸入的不是整數,cin>>a是無效輸入,不能再輸入。

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM