getline 需要一次还是两次回车

来源:互联网 发布:淘宝wow 编辑:程序博客网 时间:2024/04/27 03:41

---出现问题---
一个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',然后结束;