cin.getline()与getline()
---出现问题--- 一个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中这种现象不会出现。