首页 > 编程语言 >C++初学(15)

C++初学(15)

时间:2024-08-24 21:55:55浏览次数:13  
标签:ch 15 cout get int cin C++ char 初学

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

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()之间的区别:

标签:ch,15,cout,get,int,cin,C++,char,初学
From: https://blog.csdn.net/2301_79654372/article/details/141466652

相关文章

  • C++ //练习 19.21 编写你自己的Token类。
    C++Primer(第5版)练习19.21练习19.21编写你自己的Token类。环境:LinuxUbuntu(云服务器)工具:vim 代码块classToken{ public: Token():tok(INT),ival(0){} Token(constToken&t):tok(t.tok){copyUnion(t);} Token&operator=(constToken&); ~Token(){......
  • C++ //练习 19.23 为你的Token类添加移动构造函数和移动赋值运算符。
    C++Primer(第5版)练习19.23练习19.23为你的Token类添加移动构造函数和移动赋值运算符。环境:LinuxUbuntu(云服务器)工具:vim 代码块classToken{ public: Token():tok(INT),ival(0){} Token(constToken&t):tok(t.tok){copyUnion(t);} Token&operator=(......
  • C++基础/限定符及一些关键字在限定函数的作用
    在学习中发现对const在限定函数的作用有些模糊,以下为笔者的学习总结1.5cv限定符及一些关键字在限定函数的作用c(const)v(volatile)const:用于表示该函数不会改变类的成员变量,所以是可以修改全局变量的volatile:用于告诉编译器该对象可能会被程序外部修改#include<iostream>......
  • P7515 [省选联考 2021 A 卷] 矩阵游戏 题解
    DescriptionAlice有一个\(n\timesm\)的矩阵\(a_{i,j}\)(\(1\lei\len\),\(1\lej\lem\)),其每个元素为大小不超过\({10}^6\)的非负整数。Bob根据该矩阵生成了一个\((n-1)\times(m-1)\)的矩阵\(b_{i,j}\)(\(1\lei\len-1\),\(1\lej\lem-1\)),每个......
  • c++贪心、模拟超详细讲解
    一、贪心算法基础1.1定义与原理定义:贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。原理:贪心算法通过局部最优选择来构造全局最优解。在每一步,算法都做出一个看起来最优的决策,期望通过局部最优达到全局......
  • c++SPFA细剖
    SPFA(ShortestPathFasterAlgorithm),作为一种高效的最短路算法,是Bellman-Ford算法的改进版本,结合了Dijkstra算法和Bellman-Ford算法的优点。下面我将从十个大的方面对SPFA算法进行详细剖析,每个大点下再分若干小点进行阐述。一、算法背景与起源1.1算法起源SPFA算法由西安交......
  • c++-类(中)
    c++-类(中)一、类的默认成员函数1.1什么是默认成员函数?1.2默认成员函数有哪些?二、构造函数2.1什么是构造函数?2.2构造函数的特点三、析构函数3.1什么是析构函数?3.2析构函数的特点四、拷贝构造函数4.1什么是拷贝构造函数?4.2拷贝构造函数的特点五、赋值运算符重载......
  • C++:强制类型转换速通
    强制类型转换核心为四个cast类型分别是:static_castdynamic_castconst_castreinterpret_cast补充:转换是否安全首先,派生类内一定有基类。基类指针可以指向派生类如果将指向基类的指针指向派生类,派生类对象在内存中的布局通常会以基类部分的开头,派生类可以看做是对基类......
  • C++:STL六大组件,知识点总结。
    STL知识点总结STL是C++标准库中的一个重要部分,提供了一组灵活通用的数据结构,核心是模板类。接下来是STL的主要组件及其功能简介。1.容器容器是用来存储和管理一组数据的对象。不同的容器适用于不同类型的数据存储需求。可理解为各种形式实现的存储结构顺序容器vec......
  • Qt/C++音视频开发81-采集本地麦克风/本地摄像头带麦克风/桌面采集和麦克风/本地设备和
    一、前言随着直播的兴起,采集本地摄像头和麦克风进行直播推流,也是一个刚需,最简单的做法是直接用ffmpeg命令行采集并推流,这种方式简单粗暴,但是不能实时预览画面,而且不方便加上一些特殊要求。之前就已经打通了音视频文件和视频流的采集,那是不是可以简单点的方式就能直接加入到原有的......