cin流 吃过的亏!

在getline的代码上方使用过cin流来获取过键盘输入时,getline会出现直接跳过。

#include<bits/stdc++.h>
using namespace std;

int mian()
{
    int x = 0;
	cin >> x;
    //cin.ignore();
    //cin.sync();

	string str;
    getline(cin, str);
    cout << str << endl;
    
    system("pause");
    return 0;
}

这段代码可以如期进行吗?

肯定是不行的,不然我也不会写出来。。。

这时候输入了 x 之后,程序就直接结束了。为啥呢?

因为cin流中还残余了换行符,getline() 就直接读入换行符,然后程序结束。

想要解决这个问题,可以加上第8行注释中的语句,清空cin流,然后就可以正常输入字符串到 str 中了。

cin.ignore(int a = 1, char ch = EOF) 这个函数会忽略 a 个字符,直到字符是 ch 为止。

在这里 cin.sync() 也有同样的功能。

cin流失效

在搜索资料的过程中又发现了cin流失效的问题。

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int x = 0;
	cin >> x;  //如果此时输入字母a
	cout << "x = " << x << endl;

	//cin.clear();
	//cin.ignore();
    
	cin >> x;
	cout << "x = " << x << endl;

	string str;
	getline(cin, str);
	cout << str << endl;
    
    system("pause");
    return 0;
}

如果程序运行到第八行时输入了字母 a ,因为接收字母 a 的变量是 int 类型的,此时cin流会出错, cin.fail() == 1 。cin流会失效后,会直接输出 x = 0

在这里插入图片描述

此时如果第二个 cin >> x 想要正常输入,则需要将第11,12行中语句加上,cin.clear() 是重置错误标志位,cin.ignore() 是清除一个cin流中的字符。加上这两句后就可以正常输入数字到 x 中了。

推介看看参考4,有非常多具体实例,还讨论了cin.clear()cin.ignore() 的使用先后顺序问题(先使用 cin.clear() 重置错误标志位,然后清空cin缓存区)。

先使用cin.ignore()然后用getline()读入一行,会少一个字符

#include<bits/stdc++.h>

using namespace std;

int main()
{
	cin.ignore(5'\n');

	string str;
	getline(cin, str);
	cout << str << endl;
    
    system("pause");
    return 0;
}

这个简单示例,就更进一步演示了 cin.ignore() 的功能,就是忽略cin流中指定数目的字符,直到遇到指定字符。

参考1:link1

参考2:link2

参考3:link3

参考4:link4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值