您的位置:首页 > 其它

getline()与cin.getline()

2016-09-11 15:17 169 查看
---出现问题--- 
一个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',然后结束;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: