getline 需要一次还是两次回车
2013-07-19 14:53
183 查看
---出现问题---
一个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',然后结束;
一个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',然后结束;
相关文章推荐
- 随手记, C回车换行,0x0d 0x0a,WINDOWS下fgetc()一次读入,即\n,LINUX下fgetc()需要分两次读入0x0d, 0x0a
- vc6.0 中getline需要按两次回车的解决方法
- vc6.0 中getline需要按两次回车的解决方法
- vc6.0 中getline需要按两次回车的解决方法
- getline 两次回车 解决办法
- 【VC++6.0】getline需要输入2次回车才会结束的BUG修复方法
- 动态创建添加按钮后,解决开始需要点击两次才能触发,之后点击一次就可以了
- 为什么getline()后要两次回车????(将输入的字符串按单词倒序输出)
- VC6.0 中 getline(cin, string) 需按两次回车解决方法,getiline输入时的用法
- checkbox要点两次两次才能选中,让它只需要点一次
- "getline" bug fix for Microsoft Visual C++ 6.0 关于VC6的getline输入需要两个回车才结束的BUG修改方法
- Vc6.0中C++ getline 输入两次回车 解决方案;
- [技术讨论]专业词汇需要严谨的分析——Serializable到底应该是串行还是序列
- 二手房交易差额款需要一次交清?
- 进入相机,按home退出,再按camera键进入相机,需要按两次返回键才能退出问题
- 关于nodejs 假设httpserver,会发现一次网页打开,服务端会响应两次的问题;
- daemon进程fork一次和fork两次的区别?
- 解决iScroll中事件点击一次却触发两次的问题
- 一个控件需要双击两次的问题
- 我们需要的是软件工程还是其它?