c++中的get与getline

c++ 中的cin

c++中的cin以空白符(空格 回车 制表)作为分隔符,以回车作为输入结束符。在平时使用中除了输入数字,否则很难避免输入的内容包含空格等特殊字符的情况。

1
2
3
4
char name1[20];
char name2[20];
cin >> name1 >> name2;
cout << name1 << endl << name2 << endl;

如果输入barack obama,再按回车。程序直接输出

1
2
barack
obama

在此次输入中,把barack赋值给了name1,把obama赋值给了name2;(此时最后输入的回车符任保存在缓存中)。

cin.getline

好在c++给了一个解决这个问题的方法。在cin的成员函数中,有一个以回车为分隔符的函数getline()

getline()因为是cin的成员函数。所以使用方法为cin.getline()。他有(一般)两个参数,第一个为接收这行字符串的数组的名称,第二个为读取的字符数。

getline()读取某行字符时,会接收最后的回车符,然后把回车符丢弃换成空字符串'\0',所以如果getline的第二个参数为20,他最多能接收19个字符。

1
2
3
4
char name1[20];
char name2[20];
cin.getline(name1,20);
cin.getline(name2,20);

cin.get

与此同时,c++也给出了get(),与getline()不同的是,get不会接收最后的回车符(参数与getline一样)。

1
2
3
4
5
char name1[20];
char name2[20];
cin.get(name1,20);
cin.get(name2,20);
cout << name1 << name2;

输入barack obama,回车。输出的将是:

1
barack obama

因为第一个get函数完成后,\n被留在了缓存中,当执行第二个get时,程序从缓存中读到了一个\n,所以第二个get没有接收到任何参数就结束了。

为了解决这个问题,get还有一个不带参数的形式,这时只能接收一个字符,所以可以通过下面这种方式,把最后的回车用get丢弃。

1
2
3
4
char name1[20];
char name2[20];
cin.get(name1,20).get();
cin.get(name2,20).get();

如果你想保存那个字符,你可以 char a = cin.get();。或者使用get的第三种形式char a; cin.get(a);

在第一节中说到。cin以回车为输入结束,输入结束后,回车依然留在缓存中。如果你在cin后面紧接着来一个cin.get(string *,int),你的get可能接收不到任何参数。

所以像上面一样,在cin完之后,应该用一个不带参数的get把回车接收并丢弃掉。

1
2
3
char name1[20],name2[20],a[20];
cin >> a; //or (cin >> a).get();从而不要下面那句。
cin.get() //or char ch; cin.get(ch);

上面之所以能够cin.get(string *,int).get()(cin >> a).get(),是因为cin在有参数的情况下,返回的是一个cin对象(cin.get()在没有参数的情况下,返回的是接收的字符)。

get与getline

如此看来,貌似getline使用起来比get更加方便,那么get存在的意义是什么?

getline中,当输入的字符超过限制时,getline会读取她所需要的字符,并阻断接下来的输入。

1
2
3
4
char name1[5];
char name2[5];
cin.getline(name1,5).getline(name2,5);
cout << "name1: " << name1 << "\tname2: " << name2;

输入obama\n,输出的是:

1
name1: obam

get不会阻断输入,他只会接收自己需要的字符,其余的将留在缓存中:

1
2
3
4
char name1[5];
char name2[5];
cin.get(name1,5).get(name2,5);
cout << "name1: " << name1 << "\tname2: " << name2;

输入obama\n,输出:

1
char1: obam     char2: a

所以当我们不知道该输入是因为\n而结束,还是因为字符超出而结束时,只要使用get,然后用一个char ch;cin.get(ch)或者char ch = cin.get()接收缓存中的第一个字符,如果是回车符,说明正常结束,如果是一个字符,说明输入超过字符限制。

string与cin.get

因为引入string类型之前,cin就有了getgetline方法。所以cin.getcin.getline并不能处理string类。

所以处理string类的getline方法为:getline(cin,str),cin作为参数传入函数string为可扩展类型,所以不需要后面的边界参数,

1
2
string name;
getline(cin,name);j

没有对应string的get方法

------ end ------