C++初学(15)

news2024/9/24 17:18:01

前面学习了循环的工作原理,接下来来看看循环完成的一项最常见的任务:逐字符地读取来自文本或键盘的文本。

15.1、使用cin进行输入

如果需要程序使用循环来读取来自键盘的文本输入,则必须有办法直到何时停止读取。一种方式是选择某个特殊字符作为停止标志,例如下面这个程序:

#include <iostream>
int main()
{
	using namespace std;
	char ch;
	int count = 0;
	cout << "Enter characters;enter ! to quit:" << endl;
	cin >> ch;
	while (ch != '!')
	{
		cout << ch;
		++count;
		cin >> ch;
	}
	cout << endl << count << " characters read" << endl;
	return 0;
}

该程序在循环之前读取第一个输入字符,这样测试可以测试第一个字符是否为!,如果第一个为!,则可以跳过循环。

如果读取的第一个字符不是!,则程序进入该循环,显示字符,增加计数,然后读取下一个字符。读取下一个字符这一个操作十分重要,如果没有这一步,循环将会反复处理第一个字符。

但是如果我们输入空格,程序输出时将会跳过空格,这是因为cin在读取char值的时候,会忽略空格和换行符。

15.2、使用cin.get(char)进行补救

cin所属的istream类(在iostream中定义)中包含一个能够满足这种要求的成员函数。具体来说,成员函数cin.get(ch)读取输入中的下一个字符(即使为空格也读取),将其赋给变量ch。

#include <iostream>
int main()
{
	using namespace std;
	char ch;
	int count = 0;

	cout << "Enter characters;enter ! to quit:" << endl;
	cin.get(ch);
	while (ch != '!')
	{
		cout << ch;
		++count;
		cin.get(ch);
	}
	cout << endl << count << " characters read" << endl;
	return 0;
}

现在程序了写出每个字符,并将全部字符计算在内,其中包括空格。如果学过C语言,应该知道函数不加取地址符将会传值而不会改变变量,在C语言是无效的,但是在C++只要将参数声明为引用即可。引用是C++在C语言的基础上新增的一种类型,头文件iostream将cin.get(ch)的参数声明为引用类型,因此函数可以修改其参数的值。

15.3、使用哪一个cin.get()

在第七篇写过一段代码:

char name[ArSize];
……
cout << "Enter your name:" << endl;
cin.get(name, ArSize).get();

最后一行相当于连用两次函数调用:

cin.get(name, ArSize);
cin.get();

cin.get()的一个版本接受两个参数:数组名(字符串(char*类型)的地址)和ArSize(int类型的整数)。(数组名是该数组第一个元素的地址)

而这里我们这样使用cin.get():

char ch;
cin.get(ch);

 这里cin.get()接受一个char参数。与前面不同,为何可以传递一个参数?在C++中,因为它支持被称为函数重载的OOP特性,允许创建多个同名函数,条件是它们的参数列表不同。

15.4、文件尾条件

其实前面以!等符号为输入结束标志不太好用,这些符号本就合法且常用。如果输入来自于文件,则可以使用一种功能更强大的技术——检测文件尾(EOF)。

读取文本中的信息似乎同cin和键盘输入没什么关系,但其实存在两个相关的地方。首先,很多操作系统都支持重定向,允许文件替换键盘输入;其次很多操作系统都允许通过键盘来模拟文件尾条件,很多PC编程环境都将Ctrl+Z视为默认的EOF,但具体细节各不相同。如果编译环境能够检测EOF,可以在类似上面的程序中使用重定义的文件。

#include <iostream>
int main()
{
	using namespace std;
	char ch;
	int count = 0;
	cin.get(ch);
	while (cin.fail() == false)
	{
		cout << ch;
		++count;
		cin.get(ch);
	}
	cout << endl << count << " characters read" << endl;
	return 0;
}

注:vs2022有和这篇文章相似的问题 ,摁了一下enter键就解决了问题。(^Z是ctrl+z出来的)

15.5、另一个cin.get()版本

不接受任何参数的cin。get()成员函数返回输入中的下一个字符。也就是说,可以这样使用它:

ch=cin.get();

该函数的工作方式与C语言中的getchar()相似,将字符编码作为int值返回;而cin.get(ch)返回一个对象,而不是读取的字符。

为成功地使用cin.get(),需要知道其知道处理EOF条件。当该函数到达EOF时,将没有可返回的字符。cin.get()将会返回一个符号常量EOF表示的特殊值。该常量是在头文件iostream中定义的。

前面我们是这么写的:

char ch;
	int count = 0;
	cin.get(ch);
	while (cin.fail() == false)
	{
		cout << ch;
		++count;
		cin.get(ch);
	}

而我们可以用int ch,并用cin.get()代替cin.get(char),用cout.put()(在第三篇有写)代替cout,用EOF测试代替cin.fail()测试:

    int ch;
	int count = 0;
    ch=cin.get();
	while (ch!=EOF)
	{
		cout.put(ch);
		++count;
		ch=cin.get();
	}

下面是cin.get(char)和cin.get()之间的区别:

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

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

相关文章

发布分班查询,老师都在用哪个小程序?

新学期伊始&#xff0c;校园里又迎来了一批朝气蓬勃的新生。老师们的日程表上&#xff0c;除了日常的教学准备&#xff0c;还多了一项重要的任务——分班。这项工作不仅需要老师们精心策划&#xff0c;以确保每个班级的平衡&#xff0c;还要在分班完成后&#xff0c;及时将结果…

系统架构不是设计出来的

今天给大家分享一个 X/ Twitter 早期系统架构演变的故事&#xff0c;内容来自《数据密集型应用系统设计》这本书&#xff0c;具体数据来自 X/ Twitter 在 2012 年 11 月发布的分享。 推特的两个主要业务是&#xff1a; 发布推文&#xff08;Tweets&#xff09;。用户可以向其粉…

零基础入门~汇编语言(第四版王爽)~第3章寄存器(内存访问)

文章目录 前言3.1 内存中字的存储3.2 DS 和[address]3.3 字的传送3.4 mov、add、sub指令3.5 数据段检测点3.13.6 栈3.7 CPU提供的栈机制3.8 栈顶超界的问题3.9 push、pop指令3.10 栈 段检测点3.2实验2 用机器指令和汇编指令编程 前言 第2章中&#xff0c;我们主要从CPU 如何执…

2月公开赛Web-ssrfme

考点&#xff1a; redis未授权访问 源码&#xff1a; <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);echo curl_exec($ch);curl_close($ch); }if(isset($_GET[url…

回归预测 | Matlab实现WOA-ESN鲸鱼算法优化回声状态网络多输入单输出回归预测

回归预测 | Matlab实现WOA-ESN鲸鱼算法优化回声状态网络多输入单输出回归预测 目录 回归预测 | Matlab实现WOA-ESN鲸鱼算法优化回声状态网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现WOA-ESN鲸鱼算法优化回声状态网络多输入单输出…

vue3 生命周期钩子

在 Vue 3 中&#xff0c;可以在组件不同阶段的生命周期执行特定逻辑。 生命周期整体分为四个阶段&#xff1a;创建、挂载、更新、卸载。 创建阶段 组合式APIsetup() 这是组合式 API 的入口点&#xff0c;在组件实例创建之前被调用。在此阶段&#xff0c;可以初始化响应式数据…

一键批量查询邮政快递,物流状态尽在掌握

邮政快递批量查询&#xff0c;轻松掌握物流动态 在电商行业蓬勃发展的今天&#xff0c;邮政快递作为连接商家与消费者的桥梁&#xff0c;其物流信息的及时性和准确性对于提升客户体验至关重要。然而&#xff0c;面对海量的快递单号&#xff0c;如何高效地进行批量查询&#xf…

【最长上升子序列】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1010; int a[N], f[N]; int main() {int n;cin >> n;for(int i 1; i < n; i) cin >> a[i];int res 0;for(int i 1; i < n; i){f[i] 1;for(int j 1; j < i; j){if(a[j] &…

(贪心) LeetCode 135. 分发糖果

原题链接 一. 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xf…

UE5 蓝图 计算当前时间段

思路&#xff1a; 那当前hour与阈值hour对比 。小于返回&#xff0c;大于就继续循环对比。 临时变量 折叠图表↓

快排之自省排序

introsort是introspective sort采⽤了缩写&#xff0c;他的名字其实表达了他的实现思路&#xff0c;他的思路就是进行⾃我侦测和反省&#xff0c;快排递归深度太深&#xff08;sgi stl中使⽤的是深度为2倍排序元素数量的对数值&#xff09;那就说明在这种数据序列下&#xff0c…

数据结构-栈与队列-数组和链表的推广运用-第六天

hello算法 1.数组和队列作为最基础的两种数据结构&#xff0c;区别主要在于&#xff1a; 1.数组是连续存储&#xff0c;因此可以利用一个开始节点的地址直接确定其他的节点地址。 2.链表未绑定的存储顺序&#xff0c;具有更灵活快捷的增删改查。 3.为了解决存储的问题&#xf…

【Simulink】使用简化机械臂系统动力学的抓取和放置任务及轨迹调度

abbSavedConfigs.mat 文件中的配置 文件中保存了多个关节角度配置&#xff0c;每个配置对应不同的机器人操作步骤。这些配置通常用于控制机器人在执行任务时的各个关键姿态和动作。 各个配置的功能解释&#xff1a; configSequence (18x7 double): 功能: 包含了机器人执行任…

外卖系统开发:如何打造一个无缝衔接的用户体验?

在如今高度竞争的外卖市场中&#xff0c;用户体验决定了一个外卖平台的成败。为了打造一个无缝衔接的用户体验&#xff0c;外卖系统的每一个环节都需要精心设计和优化&#xff0c;从用户下单到订单配送&#xff0c;每一步都必须顺畅无阻。本文将探讨如何通过技术手段和代码实现…

使用Python+os+fnmatch搜索文件和目录

一、搜索/home/Download目录下的zip压缩文件 import os from fnmatch import fnmatch# 搜索与pattern匹配的文件和目录 def find_file(pattern, path):result []for root, dirs, files in os.walk(path):for name in files:if fnmatch(name, pattern):result.append(os.path.…

R语言function快速掌握-自定义函数

R语言在生物学中运用的比较多的还是吊包然后使用内置函数进行一次性工作&#xff0c;但是生物信息与计算生物学领域确实低估和忽视了R语言在循环和自定义函数方面的优势。 在R语言中&#xff0c;function 是一个核心概念&#xff0c;它允许用户创建可重用的代码块来执行特定的…

【PHP报错已解决】‘/www/wwwroot/xxxxxx/public/../thinkphp/start.php‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 作为开发者&#xff0c;遇到报错信息是在所难免的。然而&#xff0c;有些报错信息可能会让我们感到困惑&…

每日OJ_牛客_淘宝网店(日期模拟)

目录 牛客_淘宝网店&#xff08;日期模拟&#xff09; 解析代码 牛客_淘宝网店&#xff08;日期模拟&#xff09; 淘宝网店__牛客网 解析代码 这是一个变相的日期计算器。只不过2、3、5、7、11月算1天&#xff0c;其他7个月算2天。 既然是一个变相的日期计算器&#xff0c;那…

24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,337. 打家劫舍 III

目录 198. 打家劫舍题目描述题解 213. 打家劫舍 II题目描述题解 337. 打家劫舍 III题目描述题解 打家劫舍的一天 &#x1f608; 198. 打家劫舍 点此跳转题目链接 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷…

初出茅庐:怎样获得实习机会——之找到一份工作

如果你刚开始工作&#xff0c;找到工作的最好和最简单的方法之一就是【实习】&#xff1b;许多技术类公司只雇佣实习生或者经验丰富的软件开发者&#xff0c;实习为公司提供了一个独一无二的机会&#xff0c;使其可以在雇用潜在员工之前对他们进行充分的评估。但实习的机会不是…