C++中cin get getline的知识

C++ cin get getline详细

cin 字符串的输入

1 cin >> 输入是标准输入流对象 读取数据是通过键盘进行输入 cin>> 读取时 只能读取想要的数据类型

!!!!但是不能读取空格和换行符

但是cin读取是怎么知道读取完的呢 是通过空白(空格、制表符和换行符)来确定的字符串的结束位置

也就说当我们想输入这种 New York时 cin只能读取到New 因为有空格 York会留在缓冲区

int a = 0;
cin >> a;//这里如果你输入其他类型的 比如在键盘上输入A 在cin >> 是无法读取的 A会留在缓冲区 然后等待读取

char c;
cin >> c;.//这个时候才会读取A 但是不会读取空格和换行符 会跳过

针对这种问题 有两种方式来解决这种问题:

通过每次读取一行字符串输入

cin.getline()cin.get() getline() `

这两个是istream中的类 cin 的成员函数 两个面向行的成员函数 这两个函数都是按行读取 直到达到换行符就停止读数

区别

getline() 在读取时会丢弃换行符 however 当get() 在读取时会将换行符留在输入序列中

1 面向行的输入:getline()

getline()可以通过cin.getline()调用 会在按下回车后读取到换行符就停止读取 或者读取到了指定字符数就停止

该函数有两个参数 第一个参数就是你读取的数据想要放的数组 第二个参数就是想要读取的字符数

比如想要读取20个字符 最多只能读取19个 剩下的空间要自动在结尾处添加空字符

就是假设将姓名读入到一个包含20个元素的name数组中 可以这样写 代码如下

char name[20];
cin.getline(name,20);

这样就解决了只能读取一个字符不能识别空格的问题

getline()是每次读取一行 通过换行符来确定行尾 但是不保存换行符 相反 存储字符串是用空字符代替换行符 在结尾处 就是读取到换行符 会转换成为空字符 ‘\0’

2 面向行的输入:get()

1 通过get输入的时候 我们输入完毕会按下回车 回车会被识别为换行符(\n)存储在输入缓冲区中 get会识别 认为输入结束 如果输入的是abcd 按下回车也就是换行符也会被识别 所以字节个数其实是5

2 如果你下一行还要通过get进行输入是无法进行输入因为按下回车也就是换行符会留在输出序列中 然后被第二个get识别到 由结论1可知第二个get无法再进行输入

    char name[20]; 
    char age[20];
	cin.get(name, 20);//get会保留最后的换行符 就是你输入之后按一下回车 这样两个连在一起 第一个调用后 换行符会留在输出队列中
	cin.get(age, 20);//导致在这里再进行输入的时候 第一个识别的是换行符 换行符就是意味着队尾 它无法跳过 所以不能再进行输入

根据这个问题 也有两种解决办法

1 是在这两个中间加一个cin.get()来读取留在输入序列中的换行符

    char name[20]; 
    char age[20];

    cin.get(name, 20);
    cin.get();//读取留在输入序列中的换行符
    cin.get(age, 20);

2 是如下的代码

之所以可以这样写 是因为cin.get()返回的是一个cin对象 然后再调用一次成员函数get()

    char name[20]; 
    char age[20];
	cin.get(name, 20);
	cin.get(age, 20);

   cin.get(name, 20).get(age, 20);//连续调用 
3 getline()和get()遇到空行或其他问题

现在的做法是当get()(不是getlin())读取空行后将设置失效位(failbit) 这意味着接下来的输入将被阻断

但是可以通过下面的命令恢复

cin.clear();

另一个问题就是如果字符串长度比分配的空间长,如果输入的比指定的参数多,则这两个成员函数会将多的留在输出队列中,而getline()会设置失效位,并关闭后面的输入

其中一些资料来自于C++ Primer Plus

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值