转载请注明出处谢谢:http://blog.csdn.net/u011504118
在C++中最常用到的输入自然是cin
了,但它有个缺点就是当输入有空格时,只能读取到空格前面的内容。我们自然是希望能够读取到一整行的内容了。好在C++中提供了两个函数:get
和getline
, 也就是这篇文章的主角了。先从getline
开始吧。
getline()
当我们想从输入流中读取到一行数据时,我们可以这样调用cin.getline(buf, size)
, 读取指定长度的字符串或遇到换行符时结束并将结果保存在buf中。getline()
通过换行符来确定结尾,但不保存换行符。还有其他的几个重载函数,这里就不多说了。
get()
cin.get(buf, size)
也是读取一行数据,但它不读取末尾的换行符,换行符会被保留在输入队列中,也就是说,当第一次调用后,换行符留在输入队列中,因此第二次调用的时候看到的第一个字符便是换行符。可使用cin.get()
读取下一个字符(即使是换行符)。也可以这样使用cin.get(buf,size).get()
get()
测试代码:
#include<iostream>
using namespace std;
int main() {
const int size = 20;
char *str = new char[size];
cout << "get():" << endl;
cout << "请输入字符串: ";
cin.get(str, size);
cout << "the string is: " << str << endl;
delete[]str;
str = new char[size];
cout << "请再次输入字符串: ";
//cin.get();
cin.get(str, size);
cout << "the string now is: " << str << endl;
delete[]str;
return 0;
}
注释掉cin.get()
的时候可以看到:
当第一次输入回车后还没等到第二次输入结果就已经出来了!加上cin.get()
就可以正常输入第二个字符串了。
好的,那么问题来了。既然getline()
比get()
方便那么多,为什么还要有get()
呢?
get() V.S getline()
毫无疑问,getline()
比起get()
用起来要方便得多。但你是否想过这样一个问题:当用户输入的字符串的长度超过了我们定义的size,这时候我们该如何检测呢?如果说不管它的话,因为剩下的字符串还在输入流中,如果还有第二次的用户输入的话,程序就直接从输入流中提取字符串了。很明显,这是一个严重的Bug。所以我们就得找个办法来检测这种情况。聪明的你可能已经想到了get()
的优势了。没错,就是利用这次看似多余的cin.get()
来判断取得的字符是不是换行符,如果是的话证明我们读取到了整个字符串了。而getline()
要检测就比较麻烦了。这个比较简单,这里就不再给出例子了。大家可以动手写一写,理解就会更深了。
getline()
和get()
还有一个大的区别:当get()
读取到空行时会设置失效位(failbit),这意味着接下来的输入都被阻断,但可以用cin.clear()
来恢复。getline
读取到空行时则不会有这个问题。
看一下例子吧:
#include<iostream>
using namespace std;
int main() {
const int size = 20;
char *str = new char[size];
cout << "get():" << endl;
cout << "请输入字符串: ";
cin.get(str, size);
// 通过获得的字符串长度来判断是否为空行
/*
if (strlen(str) == 0) {
cin.clear();
}
*/
cout << "the string is: " << str << endl;
delete[]str;
str = new char[size];
cout << "请再次输入字符串: ";
cin.get();
cin.get(str, size);
cout << "the string now is: " << str << endl;
delete[]str;
return 0;
}
运行程序,然后输入回车,可以看到这样的结果:
当回车后,程序并没有执行第二次的输入,而是直接输出了结果。
把上面的代码中的注释去掉后就能看到正确的结果了,比如:
getline()
和get()
应该是还有其它的区别的,等以后遇到了再补上吧。
最后还有一点要提醒的就是,对指针使用new
之后一定要用delete
掉,否则可能会造成内存泄露!!!