---出現問題--- 一個getline和cin.geline這兩個函數的區別: 這兩個函數同時是存儲一個句子,用getline函數時,當輸入一個字符串時,要敲兩下回車,這個語句才結束,而用cin.getline則不用: #include <iostream> #include <string> using namespace std; main () { string name; getline (cin, name); cout <<name<<endl; } //需要敲兩次回車語句才結束 //當我輸入one sentence[ENTER]時,它並不運行cout這個語句,而是光標還在編繹窗口上閃動,要再按一下[ENTER]才會運行cout這個語句 #include <iostream> #include <string> using namespace std; main () { char name[100]; cin.getline (name , 100); cout <<name<<endl; } //這個程序敲一次[ENTER]即可
---不同之處---
1.istream& getline( istream& is, string& s, char delimiter = '/n' ); 2.cin.getline(string &,LENGTH,char delimiter = '/n' ); 是兩個不同的函數; 一個是屬於string; 一個是屬於istream流; ---為什么導致前面出現的問題--- getline和cin.get實際上都是3個參數的(最后一個經常省略),我覺得這兩個函數的結果應該是一樣的,出現不同的結果的可能是函數參數寫的不 完整導致的。因為第三個參數可以省略(系統會自動給出),所以我們不去注意它。我測試了一下,如果把參數補上,則2個函數的結果是一樣的。具體如下(這里 我們把'z'作為結束字符): //程序1 #include <iostream> #include <string> using namespace std; main () { string name; getline (cin,name,'z'); cout <<name<<endl; } //程序2 #include <iostream> #include <string> using namespace std; main () { char name[100]; cin.getline (name , 100,'z'); cout <<name<<endl; } 下面是運行結果,其中前4行為輸入內容,后5行為輸入內容: jkljkl jkljkl jkljkl jkl jkljkl jkljkl jkljkljkl jkljkl jkljkljklz jkljkl jkljkl jkljkl jkl jkljkl jkljkl jkljkljkl jkljkl jkljkljkl Press any key to continue 可以看出,在我輸入結束字符'z',之前,輸入的字符、空格和回車全部都原樣輸出,兩者並沒有任何區別;
這樣一比較getline(cin,name)和帶結束參數的這個函數似乎更為接近(等待系統再次輸出一個回車之后結束輸入,帶參數的是等待輸入結 束符z結束輸入),這么說getline的默認結束符可能是回車,而正是第二個結束符結束了輸入並輸出;但是,問題是,那第一個回車怎么不結束輸入呢?就 getline(cin,name,'z')來說,如果我們輸入jklzjklz,那系統輸出必然是jkl,怎么可能等第二個結束符呢!好我們測試一下, 到底哪個回車才是真正的結束符: 輸入jkljkl[ENDTER]之后,不運行cout,只是光標換行了;然后輸入abc[ENDTER] 輸出為:jkljkl
把abc換成別的也是一樣的效果,這說明第一次回車的時候,輸入就結束了!第二個回車完全是多余的! 實際上有很多人說這是vc的一個bug,也有人說不是,但是也說不上它到底有什么作用; 如果把getline的第二個回車理解為多余的話,那么這里的getline(cin,name)和cin.getline(name,100)在 功能上就一樣了;
另一點,getline()和cin.getline()其實並不只是可以輸入一行,也可以輸入一篇文章,只要設置恰當的結束符就可以了;我們平時 不帶參數時就不能,因為默認的結束符是'/0'(注意並不是回車),當你回車的時候,系統認為你輸入完畢,自動會在句尾加上'/0',然后結束; NOTE:原來這個問題在VC6.0上才會出現輸入兩次的情況,在vs2005中這種現象不會出現。