get()与getline()

来源:互联网 发布:hugo boss档次知乎 编辑:程序博客网 时间:2024/06/06 00:57

以下内容来自:http://yanger2004.ycool.com/post.2831191.html

相同点
要获取一行的输入,标准流类的成员函数getline(),get()都有三个参数,比如getline
(char*line,int size,char ='/n')。其中第一个参数指向存储结果字符的缓冲区指针,第二个表示缓冲区大小(本次读取的最大字符个数,不能够超过其限度),第三个表示知道什么时候停止读输入的终止符(读取一行结束的标志)。终止符有一个经常用到的缺省值"/n"。两个函数遇
到输入终止符时,都把零储存在结果缓冲区里。
不同点

2.在处理字符串时,get()遇到输入流的分隔符时就停止,而不从输入流中提取分隔符。比如用
cin.get(myarray1,30,'*');处理字符串1111*2222,碰到*就停止。cout<<myarray1;会输出1111。然后再调用cin.get(ch1),cout<<ch1;输出的还是这个分隔符*。getline()与其相反,它从输入流中提取分隔符,但仍没有把它储存在结果缓冲区里。如果用cin.getline(myarray2,30,'*');处理上面同样的字符串1111*2222,碰到*停止。cout<<myarray2;会输出
1111。然后再调用cin.get(ch2),cout<<ch2;输出的是分隔符后面的2。

以下内容来自

http://hi.baidu.com/xystephen/blog/item/5c48402422902932c9955950.html

istream中的类提供了一些面向行的类成员函数;getline()和get()。这两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中。

getline()程序举例

#include<iostream>
using namespace std;
const int ArSize = 20;
int main()
{

 char name[ArSize];

 char dessert[ArSize];

 cout<<"Eenter your name:"<<endl;

 cin.getline(name,ArSize);

 cout<<"Eenter your favorite dessert"<<endl;

 cin.getline(dessert,ArSize);

 cout<<"I have some delicious"<<dessert;

 cout<<"for you"<<name<<"./n";

 return 0;

}

在使用 get()时应该注意 get()是将换行符保留在输入序列中,假使我们连续两次调用get()那么第二次调用时看到的第一个字符便是换行符。因此get()认为已到达行尾,而没有发现任何可读取的内容。我们可以使用不带任何参数的cin.get()调用来读取下一个字符,为读取下一行输入做好准备。

cin.get(name,ArSize);

cin.get();

cin.get(dessert,ArSize);

另外一种使用get()的方式是将两个类成员函数拼接起来;

cin.get(name,ArSize).get();

 

程序例子

#include<iostream>
using namespace std;
const int ArSize = 20;
int main()
{
 char name[ArSize];

 char dessert[ArSize];

 cout<<"Eenter your name:"<<endl;

 cin.get(name,ArSize).get();

 cout<<"Eenter your favorite dessert:"<<endl;

 cin.get(dessert,ArSize).get();

 cout<<"I have some delicious"<<dessert;

 cout<<"for you"<<name<<"./n";

 return 0;

}

当getline()和get()读取空行时;

get()读取空行后会将设置失效位。这意味接下来的输入将被阻断;但可以使用下面的命令来恢复输入

cin.clear();

另一个潜在的问题,输入字符串可能比分配的空间长。如果输入行包含的字符数比指定的多,则getline()和get()将把余下的字符留在输入队列中,而getline()还会设置失效位,并关闭后面的输入。

原创粉丝点击