【转】C++中读取一行数据:get和getline

img u011504118
        <div class="article_r">
        </div>
      </div>
      <div class="blog_article_c clearfix">
        <h3 class="article_t">C++中读取一行数据:get和getline</h3>
        <p class="date"><i>发表于</i><em>2015/3/24 19:50:18  &nbsp;</em><i>1554</i><span>人阅读</span></p>
        <p class="category_p">
                分类:
                    <span>C/C++</span>
        </p>

转载请注明出处谢谢:http://blog.csdn.net/u011504118

在C++中最常用到的输入自然是cin了,但它有个缺点就是当输入有空格时,只能读取到空格前面的内容。我们自然是希望能够读取到一整行的内容了。好在C++中提供了两个函数:getgetline, 也就是这篇文章的主角了。先从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;
}
     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

注释掉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;
}
     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

运行程序,然后输入回车,可以看到这样的结果:
这里写图片描述

当回车后,程序并没有执行第二次的输入,而是直接输出了结果。
把上面的代码中的注释去掉后就能看到正确的结果了,比如:
这里写图片描述

getline()get()应该是还有其它的区别的,等以后遇到了再补上吧。

最后还有一点要提醒的就是,对指针使用new之后一定要用delete掉,否则可能会造成内存泄露!!!

    <script type="text/javascript">
        $(function () {
            $('pre.prettyprint code').each(function () {
                var lines = $(this).text().split('\n').length;
                var $numbering = $('<ul/>').addClass('pre-numbering').hide();
                $(this).addClass('has-numbering').parent().append($numbering);
                for (i = 1; i <= lines; i++) {
                    $numbering.append($('<li/>').text(i));
                };
                $numbering.fadeIn(1700);
            });
        });
    </script>

      </div>



         <div class="blog_handle">
    <span id="digg" style="cursor:pointer"><i class="iconfont"></i><em>0</em></span>
    <span id="bury" style="cursor:pointer"><i class="iconfont"></i><em>0</em></span>

</div>



          <div class="prev_next">
                    <a href="/article/details?id=44416299" class="prev" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);">上一篇</a>                                                                       
                    <a href="/article/details?id=44794819" class="next" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">下一篇</a>
          </div>         
    </div>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值