cin内容总结,各种方法和用法的区别

平常练练算法输入都给你安排好了,cin平时随便用用就结束了,后来有的题要自己写输入的时候,发现自己对cin真不会,查了一些内容发现有挺多内容细究起来还挺有迷惑性的,于是写一个汇总备忘。

首先,明确cin是一个对象,和其他的对象一样的。其包括的方法有:

提取运算符(>>):用于从输入流中提取数据,并将数据存储到指定的变量中。

get()方法:用于从输入流中读取一个字符,并返回该字符的ASCII码值。

getline()方法:用于从输入流中读取一行数据,并将该行数据存储到指定的字符串变量中。

ignore()方法:用于忽略输入流中的指定数量的字符。

peek()方法:用于查看输入流中的下一个字符,但不将其从输入流中移除。

putback()方法:用于将一个字符插入到输入流的当前位置之前,以便该字符可以被后续的读取操作读取。

eof()方法:用于检查输入流是否已到达文件末尾。

fail()方法:用于检查输入流是否发生了错误。

clear()方法:用于清除输入流的错误标志,使其可以继续读取数据。

这个看看就行了,需要用的时候自然会。

下面说说cin读数字和读字符的具体流程:

cin读取数字时会一直读忽略所有的空格回车和Tab,直到下一个输入不是数字或者读到文件结束符Ctrl+Z(在屏幕显示的^Z字样,ASCII=26)为止。

使用cin读取字符时,它会读取输入流中的下一个字符,并将其存储在字符变量中。cin不会跳过空格或换行符。

总的来说,当输入流中的下一个字符不是变量类型所需的字符时,提取运算符会停止读取,并将输入流的错误标志设置为failbit。

数字输入

那么好了好了,现在主要讨论一下输入数字的问题,

平时用用一个cin>>a这种谁都会,出问题往往出在想要输入不定数量的数字时,应该怎么输,什么时候结束,怎么结束的问题。

int a,sum;
while(cin>>a)
{
    sum=sum+a;
}

cout<<sum<<endl;

你想算三个1相加的和,你在键盘上全部输入包括

1 1 1 ^Z(键盘操作对应Ctrl+Z)再按回车

其实当你按下回车时等于告诉计算机一个行结束符,该行结束符包含了两个字符回车符(CR,ASCII=13)和换行符(LF,ASCII=10),即“\r,\n”。

CR是移动到本行开头,下一面的输入会覆盖本行内容,LF表示此行结束,换到下一行开头,两者结合实现了换行输入的效果。

上文对CR和LF说的是打印机怎么应对行结束符的,网上查的也是这类说法,换这行那行,计算机内部都是纯逻辑概念,有物理的打印头和物理空间上每行的概念给你换行吗?没有。

所以实际到计算机时遇到CR和LF组成的行结束符(也就是敲一下回车)也代表此时才可以将输入的内容全部放进缓冲区了,然后cin才真正开始在缓冲区读取此时的全部输入,上文的例子中全部的输入包括一个1,一个空格,一个1,一个空格,一个1,一个空格,一个^Z,一个空格,最后是一个CR,一个LF

按上文说的现在cin对象应对的是int类型,遇到第一个不是数字的字符为止,所以第一个1输进去了,遇到一个空格,说明此时的1已经结束了,判断循环条件为true,赋值给a,并执行循环体。就这样把三个1全部加进sum里了,再然后读到了^Z,文件结束,执行输出,程序结束。

那么有一个问题了,到^Z就结束,缓冲区后面不是还有一个空格,一个CR,一个LF吗,剩下三个字符怎么安排的?没错,确实有。

下面再用一个实际中很可能用的情况说明:

现在要求先输入一个不定数量value,输完了之后再要求输入一个b,让sum-b。

我这里注释掉 了cin.clear();看看是什么情况

 int main() 
 {
	int value, sum = 0,b;

	while (cin >> value)
	{
		sum = sum + value;
	}
	//cin.clear();
	cin >> b;
	sum = sum - b;
	
	cout << "sum=" << sum;
	
	return 0; 
 }

在键盘依次输入如下内容,表示先输入3个value,待会再输入b:

1 2 3 ^Z 回车

结果如下,b还没输入呢,程序运行完了,sum还是一个不知道什么数,错到家了。

 这就是因为缓冲区里还剩行结束符的几个字符,自动被cin>>b读取了,然而b是int类型,读到控制字符了,甚至不是普通的字母字符,于是就乱了。

解决方法是加上一行代码cin.sync()和cin.clear(),只加cin.clear()也会有问题,就不细说的了,会有什么问题就扣的太细节了,下面贴的文章有详细说明

 int main() 
 {
	int value, sum = 0,b;

	while (cin >> value)
	{
		sum = sum + value;
	}

    cin.sync()

	cin.clear();
	cin >> b;
	sum = sum - b;
	
	cout << "sum=" << sum;
	
	return 0; 
 }

clear()和sync()具体有什么区别,可以参考这篇文章。

https://blog.csdn.net/ghost_zc/article/details/93767166 

字符输入

关于字符输入的问题主要包括getchar(),getline(),cin.getline(),cin.get()这四个内容。这四个玩意长得这么像,平时又能看到各种混着用,不自己费心总结一下,确实分不出来。

首先是getchar(),cin是没有getchar()方法的,但是又有人爱这么用,所以有时还能看到这东西,很烦。cin没有是因为getchar是C语言的库函数,作用是只读取一个字符,并返回它的ASCII,效果等于C++的get(),区别是一个用法是char a=getchar(),一个是char a=cin.get()。

所以,getchar()和cin.get()是读字符的。

说回getline,经常会看到getline和cin.getline()的用法,有什么区别呢?

一句话说明呢就是 getline()函数适用于读取C++字符串对象(即std::string)中的数据,而cin.getline()方法适用于读取C风格字符串(即char数组)中的数据。

说的详细点就是:

getline()函数是C++标准库中的一个函数,定义在<sstream>头文件中,其函数原型为:getline(istream& is, string& str, char delim)。其中,is表示输入流对象,str表示存储读取数据的字符串对象,delim表示行结束符,通常为换行符(默认值为\n)。该函数从输入流中读取数据,直到遇到行结束符为止,并将读取到的数据存储到指定的字符串对象中。

cin.getline()是C++标准库中的一个方法,定义在istream类中,其函数原型为:istream& getline(char* s, streamsize n, char delim)。其中,s表示存储读取数据的字符数组,n表示字符数组的大小,delim表示行结束符,通常为换行符(默认值为\n)。该方法从输入流中读取数据,直到遇到行结束符为止,并将读取到的数据存储到指定的字符数组中。

所以另一个角度解释可以说,一个是标准库函数,一个类方法。

那么好了好了,也许又有人问了,cin.get(),cin.getline(),getline()在是否添加行结束符有什么区别

下面的代码将读取一行文本,包括行结束符:

char str[100];

cin.get(str, 100);

下面的代码将读取一行文本,但不包括行结束符:

char str[100];

cin.getline(str, 100);

下面的代码将读取一行文本,但不包括行结束符

string str;

getline(cin, str);

总结,除了cin.get()会读取行结束符,另外两个不会。

不会真有人是二次元吧
关注 关注
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c语言cin cout,C++学习之:cout和cin用法总结
weixin_39717026的博客
05-19 4483
coutcout 用于在屏幕上显示消息,应该是 console output 的简写。它是 C++ 中 ostream 对象,该类被封装在 库中,该库定义的名称都放在命名空间 std 中,所以 cout 的全称是 std::cout 。cout 被分类为流对象,这意味着可以使用数据流的。要在屏幕上显示消息,可以发送一串字符到 cout 。例如:cout << "hello world...
C算法C++cin和scanf的区别总结)!!!
热门推荐
欢迎各位C++爱好者!
08-06 2万+
c++cin和scanf的区别 很多初学者总是纠结在C++中使用cin还是scanf。今天,我来给大家盘点一下cin和scanf的区别。 1.时间上的差距 这是一个最重要的因素,这也是为什么很多C语言的资深程序员喜欢使用scanf的原因。 在同样输入一个数,cin的编译时间大约是scanf的3~4倍。所以,在使用大量数据的时候,cin的运算速度明显要满于scanf。 简单来讲scanf 和 cin 在时间效率上差别很大的原因是: 在scanf元素的类型我们已经告知了,机器不用再去查找元素类型,scanf需
C++cin用法详细
12-23
代码编译运行环境:VS2012+Win32+Debug。 1.cin简介 cinC++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。 在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲
cin用法
weixin_46185442的博客
02-02 5811
C++ 输入输出 cin与cout 标准输入与输出cin,cout 标准错误流 cerr 标准日志流 clog cin cin 可以连续从键盘读取数据,分隔符:空格、tab键、换行(回车) cin>>等价于cin>>operator>>(),即调用成员函数来获取数据 输入数据完成后,需要再按下回车键程序才能进行下一步,且回车键的\r会被转换成\n。 缓冲区为空的时候,成员函数会阻塞等待数据的到来,一旦出现’\0’,成员函数就会读取数据,如果第一个字符是分割字符,则自动忽略
cin用法介绍
小林哥专栏
04-13 1445
第一次搞cin,真是搞昏人了,现在逐渐开始明白是什么东东,一起探讨一下吧!  首先大家要知道cin是怎么一回事,为什么要有? 在C中,输入输出要用printf和scanf,这是2个很麻烦的东西,因为在输入数据的同时还要说明数据的类型,如果输入数据较多,那就很麻烦了,所以我们的C++搞了两个更爽的东西cout和cin,来替换它们.首先我们先了解一下这两个东西的来处,它们是来自C++的一个类库叫 
C++杂项】cin的详细用法
最新发布
wlisontj的博客
04-19 2442
cin的主要用法
各种cin的初步用法
m0_43448334的博客
08-19 644
cin.get()与cin.getline()和getline(cin,?)的用法(初稿) 1)cin: 输入一个数字或字符.:接收一个字符串,遇“空格”、“TAB”、“回车”就结束. 2)cin.get(str,size): 读取所有字符,遇到’\n’时止,并且将’\n’留在输入缓冲区中,其将被下一个读取输入的操作捕获,影响该输入处理;(ps:需要在后面多加入一个cin.get()来消除“\n”...
c++cin用法总结
07-19
cin的常见用法包括使用提取运算符(>>)来读取数据。例如,cin >> variable; 将会把输入的数据存储在variable变量中。当使用cin读取数据时,它会忽略空白字符(如空格、制表符或换行符),直到遇到第一个非空白字符...
cin.get()等函数的详细用法总结
04-08
### cin.get()等函数的详细用法总结 #### 一、cin `cin`是C++标准库中的一个对象,它代表了标准输入流。在程序中,我们通常使用`cin`来读取用户从键盘输入的数据。 ##### 用法1:基本用法 最常用的方式就是使用`...
cin.clear()、cin.sync()和cin.ignor()的用法
10-31
通过了解 `cin.clear()`、`cin.sync()` 和 `cin.ignore()` 的使用方法及注意事项,我们可以更好地控制 C++ 中的输入流,避免因输入错误而导致的程序异常。在实际开发中,合理地结合使用这些函数能够有效提高程序的...
cin的输入方式
java领域博主
04-25 8447
cin常用的有三种方法cin>> cin.get() cin.getline()
C++输入cin详解
dianboliao0344的博客
01-29 907
输入原理: 程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入 #1: #include <iostream>using namespace ...
C++中的cin 深入理解
Tian_fourpieces的博客
05-09 1万+
参考网址: C++cin的深入理解 C++cin的详细用法 一、cin简介 C++中的cin是一个 istream对象,从标准输入中读取数据,在iostream头文件中定义。 流对象不能拷贝或赋值。此外,读写一个IO对象都会改变其状态,因此传递和返回的引用都不能是const的,否则无法读写。 条件状态: IO流有四种条件状态,分别用位来控制。 cin.badbit : ...
cin方法
Quan丶
09-18 814
cin、cout定义 cin是用istream类的一个对象,主要负责从标准输入读入数据。标准输入,指的是终端键盘。 cout是流的对象,即为ostream类的一个对象。 cerr是标准错误输出流的对象,也是ostream类的一个对象。标准输出指的是终端终端键盘,标准错误输出指的是终端的屏幕。 标准缓冲区 :当我们从键盘输入字符串以后,这些字符串便被写入标准缓冲区。例如键盘输入12345...
C/C++学习笔记3 - cin深入分析(下) - cin的错误处理(原创)
lewsn2008的博客
04-17 6316
深入了解cin错误处理机制,深入了解cin.clear/cin.ignore/cin.good/cin.fail等函数  在前一节中我们有几个例子中提到了cin函数出错,以致不再执行读操作(程序8)。而且我们经常会看到程序中会出现cin.clear(),cin.ignore(), cin.fail()等函数。这些函数都是与cin的错误处理有关的。这一节我们来分析一下cin的错误处理机制,并且学
C++cin方法小结
Jamelian的博客
02-18 9211
本文对cin类中的方法进行了总结,包括几种常见的输入方式等。
c++cin的基本使用方法
weixin_34356555的博客
05-19 356
一、最主要的使用方法cin&gt;&gt;           接收一个数字、字符、字符串。遇“空格”、“TAB”、“回车”都结束           比如:         &lt;span style="font-size:18px;"&gt;&lt;span style="font-size:18px;"&gt;#include &lt;iostream&gt; usin...
C++输入流cin方法详解
alihouzi的专栏
10-24 1683
istream类定义了cin对象,其包含常用的输入方法cin>>、cin.get()和cin.getline(),分别阐述此三种输入方式的特性。此三个函数都是从输入流的缓冲区(FIFO结构)读取字符。每次读取指定数目的字符,若输入流缓冲区不为空,即输入流缓冲区有剩余字符,则不再等待用户从键盘键入数据,而是直接从输入流缓冲区读字符。 1.cin>>中,“>>”被重载为输入运算符,其识别空格Spa
C++cin的详细用法(转载)
SangoHan77的博客
03-11 4495
C++cin的详细用法,文章详细的说明了cin的字符录入和string录入的各种方法,为处理循环录入有很大帮助。
cin.get()和cin.getline(有什么区别)
03-31
cin.get()和cin.getline()都是从标准输入流中读取字符,但是它们的用法区别如下: 1. cin.get()方法: 它是一个成员函数,用于从输入流中读取一个字符,包括空格和换行符,直到遇到换行符或文件结尾。一般情况下...
写文章

热门文章

  • vs code+jupyter notebook 远程连接深度学习服务器,并配置环境 4122
  • jupyter 安装问题 No such notebook dir 2930
  • 为什么反向传播更加高效 2231
  • 使用Visual keras可视化神经网络结构 1490
  • 动态规划面试常见的三道题总结 1216

最新评论

  • 动态规划面试常见的三道题总结

    CSDN-Ada助手: 推荐 算法 技能树:https://edu.csdn.net/skill/algorithm?utm_source=AI_act_algorithm

  • Unity事件和委托心得

    CSDN-Ada助手: 恭喜你写了第12篇博客!对Unity事件和委托有了更深入的理解,这是非常不易的。接下来,我建议你可以尝试深入探讨一些实际案例,或者结合一些其他相关的技术进行更深入的探讨,这样可以让读者更好地理解和运用这些知识。加油!期待你更多的精彩内容。

  • 使用Visual keras可视化神经网络结构

    94994: 这个库可以可视化一维的卷积层吗

  • Tensorflow-gpu版本匹配组合亲测能用

    CSDN-Ada助手: 非常感谢你的分享!恭喜你写了第13篇博客,并且标题看起来非常吸引人。能够亲自测试并找出Tensorflow-gpu版本的匹配组合,无疑会为很多人节省不少时间和精力。希望你能继续保持创作的热情,分享更多有关Tensorflow-gpu的经验和技巧。也许下一步你可以探索一些高级应用或者实践案例,向读者们展示如何在实际项目中充分利用Tensorflow-gpu的优势。期待你的下一篇博客,再次感谢你的分享!

  • vs code+jupyter notebook 远程连接深度学习服务器,并配置环境

    不会真有人是二次元吧: 不需要,通道不存在大概率是在配置vs code里的ssh时端口号或者主机ip地址有错误,建议询问服务器管理员

最新文章

  • Addressable Assets翻译(一)
  • 动态规划面试常见的三道题总结
  • Tensorflow-gpu版本匹配组合亲测能用
2024年2篇
2023年6篇
2022年7篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家杭州玻璃钢雕塑优选企业玻璃钢景观欧式风水雕塑南京玻璃钢雕塑设计费用黄山玻璃钢雕塑销售哈尔滨玻璃钢雕塑设计公司呈贡玻璃钢雕塑加工上海大型商场创意商业美陈道具沈阳贵州主题玻璃钢雕塑报价嘉兴玻璃钢雕塑卡通小区玻璃钢雕塑定制平凉动物玻璃钢雕塑设计中山玻璃钢雕塑有限公司广东户外玻璃钢雕塑价位杭州景观玻璃钢雕塑销售厂家玻璃钢仿真刻字假山雕塑睢阳玻璃钢雕塑河南玻璃钢卡通雕塑楼盘玻璃钢人物雕塑代理商天门卡通玻璃钢雕塑圆球玻璃钢雕塑宫灯四川商业商场美陈批发价广东玻璃钢仿真雕塑桥北商场春季美陈玻璃钢果篮雕塑报价表福州玻璃钢牛雕塑批发宁夏卡通玻璃钢雕塑安装安阳玻璃钢雕塑公司许昌城市玻璃钢雕塑定做甘南动物玻璃钢雕塑价格玻璃钢雕塑淘宝教程香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化