C++ std::cin

news2024/11/27 16:39:20

C++ std::cin

  • 相关概念
  • 使用
    • 1. 一个常见的使用场景:
    • 2. 用于静态对象的构造和析构函数中,访问标准输入/输出流是安全的。
    • 3. 作为 *while* 语句的条件
    • 4. 配合 *get*、*getline* 使用

相关概念

  • istream 一个class,提供输入操作。
  • cin 一个 istream 对象,用于从标准输入读取数据。
  • >> 运算符,用于从一个 istream 对象读取输入数据。

【注】cin 中的字符 ‘c’ 指 ‘character’,“cin” 就是 ‘character input’ 的意思

std::cin 是一个全局对象,与标准C输入流 stdin 关联。

使用

1. 一个常见的使用场景:

int main() {
	/*
	...
	 */
	int ival;
	cin >> ival;
	/*
	...
	 */

	return 0;
}

支持多类型输入:

int main() {
	int iage;
	std::string strname;
	std::cout << "Enter 'name' and 'age': ";
	std::cin >> strname >> iage;
	std::cout << "Name: " << strname 
			<< "\t" << "Age: " << iage << std::endl;

	return 0;
}

因为 cin 会跳过空白字符比如 空格回车,所以虽然在同一行输入了名字和类型,但是它们会分开保存到对应的变量中:

运行结果

2. 用于静态对象的构造和析构函数中,访问标准输入/输出流是安全的。

#include<iostream>
struct UserDefinedStruct{
	int m_ival;
	UserDefinedStruct() {
		std::cout << "Enter ival: ";
		std::cin >> m_ival;
	}
};
// 定义一个静态对象
UserDefinedStruct uds;

int main() {
	std::cout << "uds.m_ival is "
			<< uds.m_ival
			<< std::endl;

	return 0;
}

3. 作为 while 语句的条件

int ival;

while(cin >> ival) {
	/*
	 ...
	 */
}

cin 操作的对象是一个 int 变量,输入运算符期待读取一个 int,当输入不符合期待时(比如输入字符 ‘a’),cin 就会进入错误状态,因此跳出循环。

那么 cin >> ival 为什么可以作为 while 的条件?
查看操作符 >> 的函数定义:

basic_istream& operator>>( int& value );

也就是说,basic_istream 在特定上下文中是可以隐式转换为一个 bool 值。我们知道 IO 操作的一个问题就是它有可能会产生问题。。。因此 IO 类中定义了一些函数和标志以便于使用者访问和操纵流的条件状态,参看 C++ Primer 第五版

C++ Primer IO库条件状态

cin >> ival 之所以可以作为 while 语句的条件,是因为 istream 重载了 operator bool,而 operator bool 会在 fail()false 并且还处于 IO ready state 的时候返回 true
cin >> ival 遇到键入的 ‘a’ 时,因为 ‘a’ 并不是理想的输入,failbit 置位,又因为是在 while 的条件中,这是一个 bool 语境,因此调用了 operator bool, 而 operator bool 中又调用了 fail(),因为 fail() 返回 true,所以 operator bool 返回 false。。。因此退出了循环(为什么不调用 good() 呢。。。)
这个转换是隐式的,咋一看会很迷惑。

前面的例子都是通过 cin 搭配操作符 << 来使用的,外部输入的数据被保存在 cin 的缓冲区中,通过操作符 “<<” 把数据从 cin 中提取出来。操作符 >> 表现为带格式的输入。
在不带格式的输入场景下,可以使用 get 或者 getline

4. 配合 getgetline 使用

cinget 或者 getline 的组合使用方式十分相似:

// 程序 1
#define MAX_LEN	20

int main() {
	char ch[MAX_LEN];
	std::cout << "Enter: ";
	std::cin.get(ch, MAX_LEN);
	std::cout << "Entered: " << std::endl;

	// 这里用于输出计数
	for(int i = 0; i != 4; ++i) {
		for (int j = 0; j != 10; ++j) {
			std::cout << j;
		}
	}

	std::cout << '\n';
	std::cout << ch;

	return 0;
}

输入字符串在长度限制内:
输入字符串在长度限制内
输入字符串超出长度限制:
输入字符串超出长度限制

// 程序 2
#include<iostream>

int main() {
	char strname[32];
	char straddr[256];

	std::cout << "Enter your name: ";
	std::cin.getline(strname, 32);

	std::cout << "Enter your address: ";
	std::cin.getline(straddr, 256);

	std::cout << strname << "'s address: " << straddr << std::endl;

	return 0;
}

不同的是 get 每次读取一整行并把换行符留在输入队列中,因此在连续多次输入的场景下需要在每次 get 用户输入后再调用一次 get 读取换行符,或者调用 ignore 忽略换行符。而 getline 每次读取一整行后会把换行符丢弃(可以修改程序 2 中的 getline 进行测试)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaweb游戏代练网站设计与实现

目 录 第1章 绪论 5 1.1 选题的依据及意义 5 1.2 国内外现状研究 6 1.3 研究目的 6 第2章 设计技术与开发环境 7 2.1 相关技术介绍 7 2.1.1 JSP简介 7 2.1.2 B/S模式分析 8 2.1.3 mysql简介 9 2.2 开发环境介绍 9 2.2.1 Myeclipse简介 9 2…

魔镜魔镜告诉我,如何挑选靠谱的硬件方案!

随着传统健身房半胁迫顾客进行数万元的预售、办卡后&#xff0c;分分钟遁地跑路的新闻已经在大家心中留下了深深的烙印&#xff0c;再加上良莠不齐的教练、器材质量、永远无法抢到的健身课、以及办卡之后就被“打入冷宫”……可真是苦了每一个无处安放的运动灵魂啊&#xff01;…

XCODE14生成的APP制作成IPA

1.用XCODE14生成Archives存档包 2.在Finder中显示 3.显示包内容 4.双击进入Products 5.双击进入Applications 6.复制生成的.App文件到Playload文件夹 压缩Playload文件夹成zip 重命名zip为ipa 在弹出 的 提示中 选择 Use .ipa 重命名IPA文件为自己的命名

【vscode】SSH连接远程服务器Host/容器

目录 1. 连接远程服务器 1.1 确保远程服务器Host上ssh打开 1.2 本地主机 1.2.1 安装ssh-client 1.2.2 安装vscode插件 1.2.3 通过密钥完成身份认证 1.2.4 SSH连接配置 2. Python代码跳转 3. C代码跳转 4. Git 历史记录 5. 连接远程服务器上的Docker容器&#xff08;易…

radmin远程控制软件怎么样,有没有替代品

Radmin 是流行的、屡获殊荣的安全远程控制软件&#xff0c;它使您能够在远程计算机上实时工作&#xff0c;就像使用它自己的键盘和鼠标一样。 您可以从多个地方远程访问同一台计算机&#xff0c;是网络和管理类别中流行的远程桌面工具。 Radmin 是外国软件&#xff0c;在国内使…

Unity协程和线程的区别深入理解(附实验展示)

Unity协程和线程的区别附实验展示写在前面协程、进程、线程的概念进程与线程的区别协程与线程的区别实验1&#xff1a;协程中执行普通函数实验2&#xff1a;协程中开启另一个协程实验3&#xff1a;协程中开启WWW请求实验4&#xff1a;一个脚本中多个协程访问临界资源实验5&…

车载以太网基础篇之Eth Driver

车载以太网基础篇之Ethernet Driver前言 首先&#xff0c;请问大家几个小小问题&#xff0c;你清楚&#xff1a; 你知道Eth Driver模块的主要作用是什么吗&#xff1f;EthDriver与以太网控制器&#xff0c;以太网收发器&#xff0c;都有哪些关系呢&#xff1f;Eth Driver的常…

java虚拟机反射机制

&#xff08;1&#xff09;Java虚拟机反射机制的定义&#xff1f; Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功…

苍穹最终一致性使用

适用场景 最终一致模式可以保证跨数据库或跨节点更新时的数据一致。它会以1个更新操作为基准&#xff0c;注册多个其它更新操作&#xff0c;最终保证所有更新都成功&#xff0c;实现分布式事务的弱一致性。可以适用一个更新适用多个场景(跨云、跨库、跨系统) 工作原理 1、在第…

4月17日第壹简报,星期一,农历闰二月廿七

4月17日第壹简报&#xff0c;星期一&#xff0c;农历闰二月廿七坚持阅读&#xff0c;静待花开1. 风云三号G星顺利入轨&#xff01;我国成功发射首颗主动降水测量卫星&#xff08;能探测到毛毛雨般的降水&#xff09;。2. 四次出舱&#xff01;神舟十五号乘组刷新单个乘组出舱活…

Opencv c++ 图片截取不规则ROI区域

做目标检测的很多时候&#xff0c;需要我们选择一个相对固定的区域来识别目标。 思路很简单&#xff0c;适合相机固定&#xff0c;ROI变化不大的场景。 1、原图备份后先截取不规则的ROI区域&#xff0c;其他区域置为黑背景&#xff0c;检测识别效果 2、在原图上&#xff0c;将…

全新适配鸿蒙生态,Cocos引擎助力3D应用开发

一、适配HarmonyOS背景 HarmonyOS 3.1版本自发布以来&#xff0c;备受广大开发者的好评&#xff0c;同时也吸引了鸿蒙生态众多伙伴的青睐。 鸿蒙生态所强调的智慧全场景、多端联动与跨设备流转等能力&#xff0c;与Cocos所具有的跨平台、低功耗、高性能三大核心特点不谋而合。C…

银河麒麟服务器ky10 sp3 x86编译安装postgresql(包含uuid)

目录 下载 编译安装 目录说明 脚本文件说明 压缩包说明 脚本代码 下载 官网 PostgreSQL: The worlds most advanced open source database 源码下载地址 PostgreSQL: File Browser 有多个版本可以选择&#xff0c;我选择的是10.23 点击下载即可 我下载好之后把他上传到…

Qt网络编程 (udp广播和接收例)

大纲概述senderreceiver演示概述 使用两个项目 1 sender 用来广播"hello world";2 receiver 用来接收广播信息 sender 1 创建Qdialog类2 在sender.pro 中添加 QT network 一行代码3 在sender.h 中声明类 class QUdpSocket;在声明一个私有对象QUdpSocket *sender;…

ASEMI代理AD8226ARZ-R7亚德诺(ADI)车规级AD8226ARZ-R7

编辑&#xff1a;ll ASEMI代理AD8226ARZ-R7亚德诺&#xff08;ADI&#xff09;车规级AD8226ARZ-R7 型号&#xff1a;AD8226ARZ-R7 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;SOIC-8 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;8 类…

VS 创建ATL组件(C++)

目录1、新建ATL项目2、添加接口类、实现接口方法3、创建自己的方法。在头文件Add.h中添加声明4、在源文件Add.cpp中添加函数实现5、在MyComTest.idl中添加方法接口设置&#xff0c;如interface IAdd:IDispatch中所示。6、解决方案配置选择release, 平台选择x64,生成。MyComTest…

【数据结构与算法】判定给定的字符向量是否为回文算法

题目&#xff1a; Qestion: 试写一个算法判定给定的字符向量是否为回文。   回文解释: 回文是指正读反读均相同的字符序列&#xff0c;如“abba”和“abdba”均是回文&#xff0c;但“good”不是回文。 主要思路&#xff1a; 因为数据要求不是很严格并且是一个比较简单的…

软件测试—基础篇

软件测试—基础篇&#x1f50e;软件测试的生命周期&#x1f50e;如何描述一个BUG&#x1f50e;如何定义BUG 的级别&#x1f50e;BUG 的生命周期&#x1f50e;测试的执行与管理测试的执行与管理如何发现更多的BUG&#x1f50e;产生争执怎么办&#x1f50e;结尾&#x1f50e;软件…

基于PaddlePaddle的词向量实战 | 深度学习基础任务教程系列

词向量是自然语言处理中常见的一个操作&#xff0c;是搜索引擎、广告系统、推荐系统等互联网服务背后常见的基础技术。 在这些互联网服务里&#xff0c;我们经常要比较两个词或者两段文本之间的相关性。为了做这样的比较&#xff0c;我们往往把词表示成计算机适合处理的方式。最…

CRM管理系统有哪些优势?在企业中有什么作用?

CRM管理系统有哪些优势&#xff1f;在企业中有什么作用&#xff1f; 其实&#xff0c;公司上crm管理系统不仅不会增加员工负担&#xff0c;还能提升员工满意度、赋能员工。当然&#xff0c;前提是一款优质的CRM管理系统。 那么&#xff0c;一款优质的CRM管理系统一般具备哪些…