C++学习记录7--cin,cin.get(),cin.getline()的用法

  程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。
  接下来以下列表格进行说明。

输入缓存区12345678910
存储的内存

一、 cin

  输入结束条件 :ENTER、SPACE、TAB,然而未捕获到数据时会自动过滤掉这3个字符并从缓冲区删除。简单的理解,cin只能捕获英文单词

#include<iostream>
using namespace std;
void main()
{
    char a[10],b[10];
    char c[10]
    cin>>a;
    cin>>b;
    cin.getline(c,10);
    cout<<a;
    cout<<b;    
}

  输入:SPACE ENTERLiTABSiSPACE TAB ENTER
  输出:LiSi
  
输入后字符内容在输入缓存区如下所示:

内存地址12345678910
输入缓存区SPACEENTERLiTABSiSPACETABENTER

然而cin未捕获到数据时自动过滤掉并删除不可见字符:

内存地址12345678910
输入缓存区SPACEENTERLiTABSiSPACETABENTER

首先捕获Li赋值给a,然后滤过并删除TAB捕获Si赋值给b。

内存地址12345678910
输入缓存区SPACEENTERLiTABSiSPACETABENTER

这里写图片描述
从内存变量的值来看,cin赋值给b后,删除了ENTER(10),此时输入缓存区的情况为:

内存地址12345678910
输入缓存区SPACETAB

二、cin.get(数组名,长度,结束符)

  用来接收一行字符串,可以接收空格。
  读入的字符个数最多为(长度-1)个,结束符规定结束字符串读取的字符,默认为ENTER。当满足最大字符数或遇见结束符时,结束捕获。
  对结束符处理:不丢弃缓冲区中的ENTER

#include<iostream>
using namespace std;
void main()
{
    char a[10],b[10];
    cin.get(a,10);    //A
    //  cin.get();    //C 
    cin.get(b,10);    //B
    cout<<a;
    cout<<b;
}

  输入:12SPACE12ENTER
  输出:12SPACE12
  连续使用时,A行捕获了12SPACE12,然而输入缓存区的ENTER未被释放,被B行直接捕获赋值给b,注意此时b[0]是NULL,而不是13(CR),如下图:
  这里写图片描述
  若要读取单个字符,直接cin.get(char ch)char ch=cin.get()(长度此时缺省)。也可用来解决上述问题,如C行代码所示。

  • C++中一个汉字占两个字符
  • 回车符(ENTER、CR) ASCII:13
  • 换行符(LF)      ASCII:10

三、cin.getline(数组名,长度,结束符)

  cin.getline()和cin.get()函数用法一致,但其会:丢弃缓冲区中的ENTER
  二中的程序可以用cin.getline()解决。

#include<iostream>
using namespace std;
void main()
{
    char a[10],b[10];
    cin.getline(a,10);
    cin.getline(b,10);

    cout<<a;
    cout<<b;
}  

  
  关于cin.get()和cin.getline()函数的详细不同,请参考:
http://blog.csdn.net/xuexiacm/article/details/8101859

相关文章:
http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html
http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值