今天在学习C++的时候对getline()函数和get()函数有点蒙,特地去找了些资料,加上自己上机实验了一些,整理了一些二者的区别。
首先二者都是可以从输入流中获得字符,get()函数可以不设置参数,如char ch=cin.get();
也可以设置一个参数,这个参数为一个字符变量例如char ch;
cin.get(ch);//表示把从输入流中得到的字符赋值给ch变量 。
上面这两个用法与c语言中的getchar()相似,这里不做赘述。
下面来说一下 get()函数 带两个参数或者三个参数的用法,两个参数时调用形式为:
cin.get(指针名或数组名,获得字符的数量);
表示把获得的字符付给该数组或字符指针,例如:
`char ch[20];
cin.get(ch,15);`//把字符串赋值给数组,并在结尾加一个’\0’;
三个参数的用法与两个参数的用法相似,只不过多了一个参数终止字符;调用形式为cin.get(指针名或数组名,字符个数,终止字符);例如:
char ch[20];
cin.get(ch,15,'/');
表示把从输入流中获得的15个字符赋给ch数组,如果这期间遇到了终止字符’/’,则只把终止字符前面的字符赋值给数组。
getline()函数调用形式与get()函数的后两种用法相似,即也是从输入流中获得指定长度字符,赋值给数组或字符指针。
那二者的区别在于哪呢?先上一段代码
#include"iostream"
using namespace std;
int main()
{
char ch[20];
char *pt = ch;//指针指向该数组
cin.getline(pt,15,'/');//注意结尾会自动加'\0'
cout<< "the first part is:" << pt << endl;
cin.getline(pt,15, '/');
cout<< "the second part is:" << pt << endl;
system("pause");
return 0;
}
上面这段代码很简单,我们来试验一下,输入 I am a boy,/I am a girl./ 时会是什么样子呢?
可以看到,遇到了终止字符就停止录入字符了,下面我们再换成cin.get()函数试试呢;
代码如下
#include"iostream"
using namespace std;
int main()
{
char ch[20];
char *pt = ch;//指针指向该数组
cin.get(pt,15,'/');//注意结尾会自动加'\0'
cout<< "the first part is:" << pt << endl;
cin.get(pt,15, '/');
cout<< "the second part is:" << pt << endl;
system("pause");
return 0;
}
同样输入 I am a boy,/I am a girl./ 来运行一下试试,结果:
我们发现第二部分没有输出结果,这是怎么回事呢,为了弄清楚后面的字符串是不是还在,我修改了一下代码,如下:
#include"include.h"
int main()
{
char ch[20];
char *pt = ch;
string str;
cin.get(pt,15,'/');
cout<< "the first part is:" << pt << endl;
cin>> str;
cout<< str << endl;
cin>> str;
cout<< str << endl;
cin>> str;
cout<< str << endl;
cin>> str;
cout<< str << endl;
//cin.get(pt, 15, '/');
//cout << "the second part is:" <<pt << endl;
system("pause");
return 0;
}
把原来代码中后面的get()函数改成了 cin>>str;cout<<str<<endl; ,结果发现运行结果为
结果很明显,也就是说前面get()函数录入到终止字符后, 控制输入流的指针指在了终止字符,
所以之后用cin>>str会把/也一同录入,而getline函数没有这种现象是因为getline函数运行遇到终止字符后指针位置在终止字符后面;验证很简单,只要执行第一个get()函数之后用一个cin.ignore()函数向后跳个字符,此时使用第二个get()函数就正常了。
以上便是二者的一个很重要的区别了。
还有,get()函数在输入数组超界时会把后面的字符仍然放在输入流中,而getline函数()则会舍弃掉后面的字符,如果读者有兴趣可以自行运行一下试试。
抖个机灵,有说错的地方欢迎各位大佬指正,溜了。。。。。。。