【C++杂项】cin的详细用法

cin详细用法

  • 1. cin简介
  • 2. cin的常用读取方法
    • 2.1 `cin>>`的用法
    • 2.2 `cin.get`的用法
    • 2.3 `cin.getline`的用法
  • 3. `cin`清空输入缓冲区
  • 4. 其它方法
    • 4.1 getline()读取一行

1. cin简介

cin是C++中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,标准输入指的是终端输入。此外cout是C++中的标准输出流对象,即ostream类对象,cerr是标准错误输出流对象,也是ostream类对象。
当我们从键盘输入字符串的时候,需要敲击回车才能将这个字符串送入到缓冲区中,敲入的这个回车会被转换成一个换行符\n,这个换行符也会被存储在cin的缓冲区中并且被当成一个字符来计算。例如输入123456789,然后再敲回车将字符串输入缓冲区,那么此时缓冲区的字节数是10而不是9.
cin读取数据时也是从缓冲区获取数据,当缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。

2. cin的常用读取方法

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

2.1 cin>>的用法

cin可以连续从标准输入读取数据,以空格、tab或换行符作为一次读取的分隔符。
代码示例:

//1. cin>>
string a, b;
cin >> a;
cin >> b;
cout <<"a:"<< a << "\nb:" << b << endl;
  • 输入aaa[空格]bbb[回车]

在这里插入图片描述

  • 输入aaa[Tab]bbb[回车]
    在这里插入图片描述
    *输入aaa[回车]bbb[回车]
    在这里插入图片描述
    注意
  1. cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、Tab或回车这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。
  2. 如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理
  3. 不想略过空白字符,那就使用noskipws流控制。比如cin>>noskipws>>input;

2.2 cin.get的用法

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

int cin.get(); // 读取一个字符,不会跳过分隔符。读取成功:返回读取字符的ASCII码,遇到文件结束符时,返回EOF,即-1
istream& cin.get(char& var); // 读取一个字符,并赋值给var,不会跳过分隔符。读取成功:返回的是cin对象,因此可以支持链式操作,如 `cin.get(a).get(b)`
istream& get ( char* s, streamsize n);// 读取一行,默认以换行符结束,n表示目标空间的大小
istream& get (char* s,  streamsize n, char delim);// 读取一行,以指定的delim作为一行的结束符,n表示目标空间的大小

代码示例:

  • 读取一个字符:输入a[回车]
	int a = cin.get();int b = cin.get();cout << "a:" << a<<"\nb:"<<b << endl;

在这里插入图片描述
可以看到第一次读取,读入了字符a,并返回了ascii码。第二次读取时,直接将缓冲区残余的回车(\n,换行符)读入。

  • 读取一行:输入abcd[回车]
char buf[100];
cin.get(buf, 100);
for (int i = 0; i < 5; i++) // 假设输入5个字符
{cout << "i" << i << "=" << (int)buf[i] << endl;
}
cout << endl;
int b = cin.get();
cout <<"b:"<<b << endl;

在这里插入图片描述
可以看到这种方法读取了[回车]前的所有字符,并存入了buf,但是最后的[回车]符残留在了缓冲区中,下次利用get读取读入了[回车]

  • 以指定字符结束读取入一行:输入abcdef[回车]
char buf[100];
cin.get(buf, 100,'f');// 以f作为结束符
for (int i = 0; i < 5; i++) // 假设输入6个字符abcdef
{cout << "i" << i << "=" << (int)buf[i] << endl;
}int b = cin.get(); // 读取残余的f
cout <<"b:"<<b << endl;int c = cin.get(); // 读取残余的回车
cout << "c:" << c << endl;

在这里插入图片描述
可以看到这种方法读取了字符[f]前的所有字符,并存入了buf,但是最后的残余的[f]和[回车]残留在了缓冲区中,下次利用get读取读入了[f],最后一次读取读入了[回车]

2.3 cin.getline的用法

函数作用:从标准输入上读取一串字符串,并以指定的结束符结束
函数原型有两个

istream& getline(char*s, streamsize count); // 默认以换行符结束
istream& getline(char*s, streamsize count,char delim);// 以指定结束符结束

注意
cin.getlinecin.get的区别是:cin.getline不会将结束符或者换行符残留在输入缓冲区中。

3. cin清空输入缓冲区

清空输入缓冲区应该使用cin.ignore()
函数原型:istream& ignore(streamsize num=1,int delim=EOF)
函数作用:跳过输入流中的num个字符,或者遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干个字符)。

4. 其它方法

4.1 getline()读取一行

c++中定义了一个在std命名空间中的全局函数getline(),这个函数使用到了string字符串。
getline利用cin可以从标准输入读取一行,当遇到三种情况下会结束读取操作:1. 到文件结束 2. 到指定的符号 3. 输入达到最大限度
函数原型:

istream& getline(istream& is,string & str); // 从is读取一行到string中,默认以换行符结束
istream& getline(istream& is,string & str,char delim); // 从is读取一行到string中,以delim指定的符号结束

代码示例:

string s;
getline(cin, s);  // 默认字符结束
// getline(cin,s,'\n'); // 指定字符结束
cout <<"s:"<< s << endl;

利用这个getline和stringstream可以实现字符串的拆分
实现

string str;
string str_cin;
getline(cin,str_cin); // 从cin读入一行,假设是ab.cd.ef
// 将字符串转换成stringstream
stringstream ss;
ss<<str_cin;
while(getline(ss,str,'.') // 将ab.cd.ef按照'.'拆分
{cout<<str<<endl;
}

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

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

相关文章

ORACLE中impdp导入多个文件的方法

1、多个文件导入dumpfileexpdp_full_qytcdb_20240412_%U.dmp&#xff0c;%U代表01、02、03这些 impdp sys/123456192.168.1.200:1521/Oracle directoryjy dumpfileexpdp_full_20250412_%U.dmp logfileimpdp_$(date %Y%m%d).log table_exists_actionskip fully parallel8; 2、…

DNS服务器的管理与配置

目录 一、相关知识 域名空间 DNS服务器分类 域名解析过程 资源记录 二、安装DNS服务 安装bind软件包 DNS服务的启动与停止 配置主要名称服务器 主配置文件 从例子学起&#xff1a; &#xff08;1&#xff09;建立主配置文件named.conf &#xff08;2&#xff09;…

Windows10安装Docker Desktop(大妈看了都会)

目录 Windows10安装Docker Desktop&#xff08;大妈看了都会&#xff09; 1.前言 1.1 为什么要在Windows10上安装Docker 1.2 Docker Desktop介绍 2.下载Docker Desktop 3.启用Hyper-V以在 Windows 10上创建虚拟机 4.安装Docker Desktop 5.运行Docker Desktop 6.Docker…

阿里云图片处理之 缩放

文档 : https://help.aliyun.com/zh/oss/user-guide/resize-images-4?spma2c4g.11186623.0.0.61cd2759v4jkhX 需求 : 图片过大, 导致加载过慢, 需对图片进行压缩 <image :src"imgUrl ?x-oss-processimage/resize,h_700,m_lfit"></image>Ps : 题外话…

Linux下GPU虚拟化

在新Linux内核中体验GPU虚拟化 从内核4.10&#xff0c; 支持 virtual gpu 的代码开始汇入主线程。这部分代码主要由两部分组成&#xff1a; 首先&#xff0c; mediated 设备框架&#xff08;mdev&#xff09;&#xff0c;基本上&#xff0c;这部分代码使得内核驱动开始用vfio框…

如何下载省,市,区县行政区Shp数据

摘要&#xff1a;一般非专业的GIS应用通常会用到省市等行政区区划边界空间数据做分析&#xff0c;本文简单介绍了如何在互联网上下载省&#xff0c;市&#xff0c;区县的shp格式空间边界数据&#xff0c;并介绍了一个好用的在线数据转换工具&#xff0c;并且开源。 目录 一、下…

UTC和RTC 以及本机时间

在讨论操作系统和时间管理的上下文中&#xff0c;理解 UTC&#xff08;协调世界时间&#xff09;、RTC&#xff08;实时时钟&#xff09;以及本机时间&#xff08;系统时间&#xff09;之间的区别和联系非常重要。以下是每个概念的详细解释&#xff1a; 1. UTC&#xff08;Coor…

赠品:跳动的心

下面是一段html代码&#xff0c;你可以把它在浏览器中显示一下&#xff0c;有点意思。 <!DOCTYPE html> <html lang"en" encoding"utf-8"> <head> <meta charset"UTF-8"> <title>Titlexinxing</title…

深度 | 践行绿色健康可持续发展,这家企业提供了价值范本

文 | 螳螂观察 作者 | 余一 近段时间以来&#xff0c;小米SU7热度一直不减&#xff0c;在展露小米强大品牌号召力的同时&#xff0c;也侧面体现出了当前消费者对于新能源汽车的喜爱。 而消费者选择新能源汽车时&#xff0c;环保因素也起到了至关重要的作用。像前几日&#x…

数据结构-上三角矩阵存储方式[0知识掌握]

目标&#xff1a;看完本文章你将会了解上三角矩阵的存储方式以及矩阵中数据的位置索引号如何求 难点&#xff1a;上三角矩阵的公式推导&#xff0c;上三角任意位置对应的存储位置。 一、准备知识 1.求和公式 前n项和&#xff1a;Sn n(a1an)/2 公差&#xff1a;d后项-前项…

SASS 目录结构

SASS 目录结构的管理 对于大型项目来说&#xff0c;前端的页面很多&#xff0c;如果不能很好的管理 SASS 的目录结构或者架构&#xff0c;后续的维护可能会非常困难。SASS 7-1 是官方的一个最佳实践&#xff0c;就是将 SASS 文件按照不同的类别放入不同目录中&#xff0c;包括…

【JavaEE多线程】线程安全、锁机制及线程间通信

目录 线程安全线程安全问题的原因 synchronized 关键字-监视器锁monitor locksynchronized的特性互斥刷新内存可重入 synchronized使用范例 volatilevolatile能保证内存可见性volatile不保证原子性synchronized 也能保证内存可见性 wait 和 notifywait()方法notify()方法notify…

开发语言漫谈-JavaScript

JavaScript、Java名字很相近&#xff0c;但它们没有任何亲缘关系&#xff0c;是由不同公司开发的编程语言。Java由Sun公司&#xff08;后被Oracle收购&#xff09;开发&#xff0c;JavaScript最初是由Netscape公司开发的&#xff08;当年浏览器的霸主&#xff09;。JavaScrip…

PostgreSQL恢复系列:pg_filedump恢复字典构造---惜分飞

pg_filedump是在pg数据库极端情况下直接解析数据库文件的利器,但是由于是开源软件,本身难以实现批量处理,通过对底层基表分析,可以实现批量处理功能分析PostgreSQL库中数据库信息 --数据库查询结果 postgres# select oid,datname,datdba,dattablespace from pg_database; oid…

leetcode--3 无重复最长字串

题目描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 …

PyTorch torch.nn.functional.one_hot用法解析

1.用法 在PyTorch中&#xff0c;我们可以使用torch.nn.functional.one_hot函数来实现One-Hot编码。下面是一个简单的例子&#xff1a; import torch import torch.nn.functional as F # 假设我们有一个包含类别标签的张量 labels torch.tensor([0, 2, 1, 0, 2]) # 使用torch…

深度学习概念

AIGC数据生产&#xff1a; AIGC在生成小图片时效果更佳(因为小图信息量更少&#xff0c;相同算力下效果更好)&#xff1b;所以适合构造一些交通场景。比如护栏损坏&#xff1a;只mask原图的部分区域(图中白色区域)&#xff0c;即可引导模型在mask处生成损坏的护栏。 基于此方…

【LeetCode热题100】【动态规划】完全平方数

题目链接&#xff1a;279. 完全平方数 - 力扣&#xff08;LeetCode&#xff09; 完全平方数是可以表示成某个整数的平方的数&#xff0c;要找和为n的完全平方数的最少数目 满足要求的完全平方数最小是1&#xff0c;最大不会超过n的平方根 所以题目变成要从1&#xff0c;2&am…

【LeetCode热题100】【动态规划】最长递增子序列

题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 让dp[i]是以nums[i]为结尾的子序列的最长递增长度&#xff0c;遍历nums[i]之前的元素&#xff0c;如果有比nums[i]小的&#xff0c;说明递增子序列可以延申 class Solution { public:int le…

拖拽式工作流有哪几个优势?

在信息技术迅猛发展的今天&#xff0c;如何助力中小型企业在数字化转型的过程中平稳过渡&#xff1f;又是如何让中小型企业摆脱数据孤岛、成本投入高等各种瓶颈和难题&#xff1f;低代码技术平台是近些年较为理想的平台产品&#xff0c;其中拖拽式工作流优势特点突出&#xff0…