[C++]iostream的几种输入形式
做ACM题的时候,发现cin并不能满足所有输入要求。比如说:
每行给出一款运动鞋信息,若该款写不打折,则先后给出每种运动鞋单价P,所购买的数量Q;若打折,则先后给出每种运动鞋单价P,所购买的数量Q,折扣率C%,最后求买鞋需付多少钱。
样例输入:
346 2
271 5 50%
样例输出:
1369.50
这个时候如果还是用cin就略显无力了,因为系统并不知道你输入的第三个数到底是折扣率还是单价。
所以呢,在这里对C/C++的输入操作做个系统地学习。(以下是本人的理解,若有错误还请多多指教)
1.cin
输入结束条件:enter、space、tab
对结束符的处理:丢弃缓冲区中使得输入结束的结束符(enter、space、tab)
int main()
{
string s;
cin>>s;
cout<<s<<endl;
return ;
}
输入:Hello world!(或者Hello World!中间为tab)
输出:Hello
2.cin.get()
有4种形式,无参数char ch=cin.get()等价于有一个参数cin.get(char ch),3个参数cin.get(char array[],int length,char ch),无第三个参数也就是说只有前两个默认enter键结束。
a.读取字符
输入结束条件:enter
对结束符处理:不丢弃缓冲区中的enter(**)
int main()
{
char ch1,ch2;
cin.get(ch1);
cin.get(ch2);
cout<<ch1<<" "<<ch2<<endl;
cout<<(int)ch1<<" "<<(int)ch2<<endl; return ;
}
输入:a
输出:a
97 10
(输出第一行为a,第二行为换行,第三行为a,enter的ASCII值。)
有了对cin.get(),本文一开始的问题就迎刃而解了,因为用cin.get(),缓冲区不会丢弃enter,所以呢,当输入完P和Q我们只要判断一下接下来输入的是不是enter,就可以知道到底有没有折扣了。
cin>>a>>b;
if((cin.get(ch)&&ch!='\n')
{
cin>>c;
...
}
b.读取字符串
输入结束条件:默认enter,(因此可接受space、tab),自定义第三个参数
对结束符处理:丢弃缓冲区的enter
int main()
{
char s[];
char ch;
cin.get(s,,'c');//这里5代表输入长度,c为结束字符
cin>>ch; cout<<s<<endl;
cout<<(int)ch<<endl;
return ;
}
输入1:12345
输出1:1234
53
(12345超长,字符串按长度去“1234”,5在缓冲区,所以还没有键盘输入,ch直接取‘5’)
所以这里补充一下:程序的输入都建有一个缓冲区,当一次键盘输入结束时会将输入的数据次纳入输入缓冲区,而cin函数直接从输入缓冲区中取数据。所以当缓冲区中有残留数据是,cin函数会直接取得这些残留数据而不会请求键盘输入。
输入2:abcde
输出2:ab
99
(自定义结束符时,不丢弃缓冲区中的结束符)
3.cin.getline()
与cin.get()不同的是,cin.get()当输入的字符串超长时,不会引起cin函数的错误,cin操作继续进行,从缓冲区中取数据,就像上面的例子一样。但是cin.getline()当输入超长是,会引起后面的cin操作不再执行。
还是上面的程序(将cin.get()改为cin.getline),输入不变
输出:1234
-52
输出ch不再是‘5’,显然cin并没有操作。
参考:
1.http://blog.csdn.net/dongtingzhizi/article/details/2299358
2.http://www.cnblogs.com/A-Song/archive/2012/01/29/2331204.html
3.http://blog.csdn.net/dongtingzhizi/article/details/2299365
[C++]iostream的几种输入形式的更多相关文章
- C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()
本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...
- Tensorflow 损失函数及学习率的四种改变形式
Reference: https://blog.csdn.net/marsjhao/article/details/72630147 分类问题损失函数-交叉熵(crossentropy) 交叉熵描述的 ...
- 关于linux三种网络形式
今天是开始的第一天,额,没什么仪式.舍友偶然间提醒我,应该把学习的东西,做一下规划和整理.我想一想也是对的.所以开通了这个.希望以后回来可以看看自己曾经的幼稚,那证明了我不断在学习在进步.最近在准备C ...
- javascript——四种函数调用形式
此文的目的是分析函数的四种调用形式,弄清楚函数中this的意义,明确构造函对象的过程,学会使用上下文调用函数. 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而 ...
- JavaScript高级之函数的四种调用形式
主要内容 分析函数的四种调用形式 弄清楚函数中this的意义 明确构造函对象的过程 学会使用上下文调用函数 了解函数的调用过程有助于深入学习与分析JavaScript代码. 本文是JavaScript ...
- 做推送,怎么能不了解推送的 4 种消息形式呢?( Android 篇)
极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知. 笔者将基于官方说明与个人理解来谈一下这四种消息.本篇为 Android 篇,iOS 篇入口 ...
- 做推送,怎么能不了解推送的 4 种消息形式呢?(iOS 篇)
极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知.笔者将基于官方说明与个人理解来谈一下这四种消息.本篇为 iOS 篇,Android 篇入口. ...
- spring boot 搭建web项目常见五种返回形式
在web项目中一般常见的五种返回形式: 返回页面,使用模板引擎,spring boot推荐使用thymeleaf,类似的还有freemarker等. 返回字符串(json),一般用于完全的前后端分离开 ...
- python中的三种输入方式
python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...
随机推荐
- EMVTag系列8《IC卡公钥证书》
Ø 9F46 IC卡公钥证书 L: NI -C(有条件):如果支持DDA 发卡行认证过的IC 卡公钥 Ø 9F47 IC卡公钥指数 F: b T: 9F47 L: 1 or 3 C:如 ...
- Environment 类
提供有关当前环境和平台的信息以及操作它们的方法. 此类不能被继承. using System; using System.Collections; using System.Collections.G ...
- Jquer的三种初始化方式
$(document).ready(function(){ alert(200); }); jQuery(function($){ alert(100); }); $(function(){ aler ...
- Weka链接Mysql数据库
Weka简介 Weka的全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis),是一款免费的,非商业化(与之对应的是SPSS公司商业数据挖掘产 ...
- 源码解析之setContentView
分享一下我以前学习时做到PPT中的一部分. 不难看出其实设置布局是由PhoneWindow来完成的. 然而我们要记住DecorView: 包括:状态栏,标题栏,内容 phoneWindow -> ...
- 从此不再惧怕URI编码:JavaScript及C# URI编码详解
混乱的URI编码 JavaScript中编码有三种方法:escape.encodeURI.encodeURIComponent C#中编码主要方法:HttpUtility.UrlEncode.Serv ...
- 解决Autofac MVC 自动注入在 Areas拆分到不同dll下的注入失败问题
由于项目业务复杂,创建了多个Areas 并把他们放在了不同的项目中,项目使用AutoFac做的IOC 配置代码为 public class MvcApplication : System.Web.Ht ...
- P3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一
还是蛮简单的一道题,首先dfs一遍,在所有能到达放有干草的洞穴的所有路径中,找出路径上最小伐值的最大值,按这个值由小到大,再来一遍贪心就行了,能放就放,不能放拉倒(也可以理解为,不能放把最前一个删了) ...
- cocos2dx 3.x中的渲染机制
1.由2.x的渲染节点,变成添加渲染命令,可以避免重复渲染相同的节点,提高了渲染效率 2.单机游戏通常要求apk包在30M以内,没压缩1M会有1%的转换率(下载转换率),即收入会提高 3.2.x中首先 ...
- Unity3D学习笔记——递归+非递归遍历GameObject的子物体
在Unity3D中没有提供直接的方法获取某个GameObject的子GameObject,但是所有的GameObject都有transform对象,所以,一般是通过获取子GameObject的tran ...