DSA_输入输出

本文详细介绍了C++中cin的用法,包括cin的基础知识、常用输入方法,如cin>>、cin.get()和cin.getline()。强调在多组测试用例中使用while(cin)的必要性,以及cin在处理输入时的条件状态和如何清空输入缓冲区。同时,文章还讨论了从标准输入读取数字和字符串的各种场景。
摘要由CSDN通过智能技术生成

https://www.cnblogs.com/Allen-rg/p/13922965.html

while(cin)说明

下面谈到的输入问题其实都建议用while(cin)的形式,最主要的原因是由于牛客网在线编程和实际考试的系统中测试代码用的都是多组测试用例,如果不用while(cin)的形式或许某些情况下会正确,但是用的话基本上都能保证测试的正确性。

其实这样也是很正常的,因为代码已经编译运行过了一次,直接在该次运行中进行多组测试即可,无需多次重复编译运行。

输入

几乎所有的输入都是数字或者字符串,根据数字和字符串可以将输入分为几种情况:

0.基础知识cin的用法

1. cin 简介

cin 是 cpp 标准输入流对象,即 istream 类的对象。cin 主要用于从标准输入读取数据,这里的标准输入指终端键盘。

此外,cout 是标准输出流对象,即 ostream 类的对象。cerr 是标准错误输出流对象,也是 ostream 类的对象。

这里的标准输入指终端键盘,标准错误输出指终端屏幕

在理解 cin 功能时,不得不提标准输入缓冲区

当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符(\n),这个换行符也会被存储在 cin 的缓冲区中并且被当成一个字符来计算!

比如我们在键盘上敲下了 123456 这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是 7 ,而不是 6。

cin 读取数据也是从缓冲区中获取数据,缓冲区为空时,cin 的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发 cin 的成员函数去读取数据。

2. cin 常用输入方法

使用 cin 从标准输入读取数据时,通常用到的方法有 cin>>cin.get()cin.getline()

2.1 cin>> 的用法

cin 可以连续从键盘读取想要的数据,以空格、tab 或换行作为分隔符。实例如下。

#include <iostream>
using namespace std;

int main() {
   
	char a;
	int b;
	float c;
	cin>>a>>b>>c;
	cout<<a<<" "<<b<<" "<<c<<" "<<endl;
	return 0;
}

在屏幕中一次输入:a[回车]11[回车]5.56[回车],程序将输出如下结果:

a
11
5.56

a 11 5.56

(1)cin>> 等价于 cin.operator>>(),即调用成员函数 operator>>() 进行读取数据。
(2)当 cin>> 从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>> 会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>> 不做处理。
(3)不想略过空白字符,那就使用 noskipws 流控制。比如 cin>>noskipws>>input;

验证程序如下:

#include <string> 
#include <iostream>

using namespace std;

int main() {
   
	char a;
	int b;
	float c;
	string str;
	cin>>a>>b>>c>>str;
	cout<<a<<" "<<b<<" "<<c<<" "<<str<<endl;

	string test;
	getline(cin,test);	//不阻塞
	cout<<"test:"<<test<<endl;
	return 0;

}

从键盘输入:[回车][回车][回车]a[回车]5[回车]2.33[回车]hello[回车],输出结果是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gef9kft6-1637483340340)(DSA_输入输出.assets/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTUwOTA0MjEzNTU0MzM4)]

从结果可以看出,cin>> 对缓冲区中的第一个换行符视而不见,采取的措施是忽略清除,继续阻塞等待缓冲区有效数据的到来。但是,getline() 读取数据时,并非像 cin>> 那样忽略第一个换行符,getline() 发现 cin 的缓冲区中有一个残留的换行符,不阻塞请求键盘输入,直接读取,送入目标字符串后,因为读取的内容为空,所以程序中的变量 test 为空串。

2.2 cin.get() 的用法

该函数有多种重载形式,分为四种格式:无参,一参数,二参数,三个参数。常用的的函数原型如下:

int get();
istream& get(char& var);
istream& get( char* s, streamsize n );
istream& get( char* s,  streamsize  n, char delim);

其中 streamsize 在 Vcpp 中被定义为 long long 型。另外,还有两个重载形式不怎么使用,就不详述了,函数原型如下:

istream& get (streambuf& sb);
istream& get (streambuf& sb, char delim);

2.2.1 cin.get() 读取一个字符

读取一个字符,可以使用 cin.get() 或者 cin.get(var),示例代码如下:

#include <iostream>

using namespace std;

int main() {
   
	char a;
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值