做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的几种输入形式的更多相关文章

  1. C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()

    本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...

  2. Tensorflow 损失函数及学习率的四种改变形式

    Reference: https://blog.csdn.net/marsjhao/article/details/72630147 分类问题损失函数-交叉熵(crossentropy) 交叉熵描述的 ...

  3. 关于linux三种网络形式

    今天是开始的第一天,额,没什么仪式.舍友偶然间提醒我,应该把学习的东西,做一下规划和整理.我想一想也是对的.所以开通了这个.希望以后回来可以看看自己曾经的幼稚,那证明了我不断在学习在进步.最近在准备C ...

  4. javascript——四种函数调用形式

    此文的目的是分析函数的四种调用形式,弄清楚函数中this的意义,明确构造函对象的过程,学会使用上下文调用函数. 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而 ...

  5. JavaScript高级之函数的四种调用形式

    主要内容 分析函数的四种调用形式 弄清楚函数中this的意义 明确构造函对象的过程 学会使用上下文调用函数 了解函数的调用过程有助于深入学习与分析JavaScript代码. 本文是JavaScript ...

  6. 做推送,怎么能不了解推送的 4 种消息形式呢?( Android 篇)

    极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知. 笔者将基于官方说明与个人理解来谈一下这四种消息.本篇为 Android 篇,iOS 篇入口 ...

  7. 做推送,怎么能不了解推送的 4 种消息形式呢?(iOS 篇)

    极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知.笔者将基于官方说明与个人理解来谈一下这四种消息.本篇为 iOS 篇,Android 篇入口. ...

  8. spring boot 搭建web项目常见五种返回形式

    在web项目中一般常见的五种返回形式: 返回页面,使用模板引擎,spring boot推荐使用thymeleaf,类似的还有freemarker等. 返回字符串(json),一般用于完全的前后端分离开 ...

  9. python中的三种输入方式

    python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...

随机推荐

  1. 解惑:NFC手机如何轻松读取银行卡信息?

    自支付宝钱包8.0推出了NFC新功能,只要将支持NFC功能的手机靠近公交卡.银行卡等带有芯片的IC卡上,可迅速读取卡内余额.卡的信息,还可以给卡进行充值,非常贴心实用. 但是很多网友表示担忧,要是别人 ...

  2. Oracle Imp and Exp (导入和导出) 数据 工具使用

    Oracle 提供两个工具imp.exe 和exp.exe分别用于导入和导出数据.这两个工具位于Oracle_home/bin目录下. 导入数据exp 1 将数据库ATSTestDB完全导出,用户名s ...

  3. MVC4.0 利用IActionFilter实现简单的后台操作日志功能

    首先我们要了解MVC提供了4种常用的拦截器:IActionFilter(Action拦截器接口).IExceptionFilter(异常拦截器接口).IResultFilter(Result拦截器接口 ...

  4. 解决vs2013不能添加控制器的步骤

    点击:vs2013 更新,更新完以后,再重启下电脑就可以正常使用了

  5. flask中文问题

    在使用flask时在模板中使用了中文,运行的时候遇到下面的问题: UnicodeDecodeError UnicodeDecodeError: 'utf8' codec can't decode by ...

  6. 权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现

    在多台机器实现负载均衡的时候,存在调度分配的问题. 如果服务器的配置的处理能力都一致的话,平均轮询分配可以直接解决问题,然而有些时候机器的处理能力是不一致的. 假如有2台机器 A和B , A的处理能力 ...

  7. transform属性

    transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度常用的创建transform结构体方法分两大类 (1) 创建“基于控件初始位置”的形变 CGAffin ...

  8. JPA学习---第十节:JPA中的一对一双向关联

    1.创建实体类,代码如下: 代码清单1: package learn.jpa.entity; import javax.persistence.CascadeType; import javax.pe ...

  9. 如何在Win10下设置图片的浏览方式为windows照片查看器

    小编前些天刚装好了win10,一阵心奋啊,今天刚打开一个图片,却发现图片的默认打开方式是window应用商店的app, 这让我觉得特别不舒服,没有之前windows自带的照片查看器好用,后来我本想进入 ...

  10. MySQL高可用读写分离方案预研

    目前公司有需求做MySQL高可用读写分离,网上搜集了不少方案,都不尽人意,下面是我结合现有组件拼凑的实现方案,亲测已满足要求,希望各位多提建议 :) 一.    网上方案整理(搜集地址不详...) 1 ...