peek() 是 istream 类的成员函数,它的原型是:

int peek();

此函数返回输入流中的下一个字符,但是并不将该字符从输入流中取走相当于只是看了一眼下一个字符,因此叫 peek。

cin.peek() 不会跳过输入流中的空格、回车符。在输入流已经结束的情况下,cin.peek() 返回 EOF。

在输入数据的格式不同,需要预先判断格式再决定如何输入时,peek() 就能起到作用。

编写一个日期格式转换程序,输入若干个日期,每行一个,要求全部转换为“mm-dd-yyyy”格式输出。输入的日期格式可以是“2011.12.24”(中式格式),也可以是“Dec 24 2011”(西式格式)。要求该程序对于以下输入数据:

Dec 3 1990
2011.2.3
458.12.1
Nov 4 1998
Feb 12 2011

输出结果应为:

12-03-1990
02-03-2011
12-01-0458
11-04-1998
02-12-2011

输入数据中的 Ctrl+Z 略去不写,因为输入数据也可能来自于文件。

编写这个程序,如果输入的是中式格式,就用 cin>>year(假设 year 是 int 类型变量)读取年份,然后再读取后面的内容;如果输入是西式格式,就用 cin>>sMonth(假设 sMonth 是 string 类型对象)读取月份,然后读取后面的内容。

可是,如果没有将数据从输入流中读取出来,就无法判断输入到底是哪种格式。即便用 cin.get() 读取一个字符后再作判断,也很不方便。例如,在输入为2011.12.24的情况下,读取第一个字符2后就知道是格式一,问题是输入流中的已经被读取了,剩下的表示年份的部分只有011,如何将这个011和前面读取的2奏成一个整数 2011,也是颇费周折的事情。使用 peek() 函数很容易解决这个问题。

示例程序如下:

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
string Months[12] = { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug", "Sep","Oct","Nov","Dec" };
int main()
{int c;while((c = cin.peek()) != EOF) { //取输入流中的第一个字符进行查看int year,month,day;if(c >= 'A' && c <= 'Z') { //美国日期格式string sMonth;cin >> sMonth >> day >> year;for(int i = 0;i < 12; ++i)  //查找月份if(sMonth == Months[i]) {month = i + 1;break;}}else { //中国日期格式cin >> year ;cin.ignore() >> month ; //用ignore跳过 "2011.12.3"中的'.'cin.ignore() >> day;}cin.ignore();   //跳过行末 '\n'cout<< setfill('0') << setw(2) << month ;//设置填充字符'\0',输出宽度2cout << "-" << setw(2) << day << "-" << setw(4) << year << endl;}return 0;
}

istream 还有一个成员函数 istream & putback(char c),可以将一个字符插入输入流的最前面。对于上面的例题,也可以在用 get() 函数读取一个字符并判断是中式格式还是西式格式时,将刚刚读取的字符再用 putback() 成员函数放回流中,然后再根据判断结果进行不同方式的读入。

C++ 查看输入流中的下一个字符相关推荐

  1. mysql逗号分隔正则查询_正则表达式在逗号分隔的列表中查找字符串和下一个字符-MySQL?...

    要搜索以逗号分隔的列表,请使用MySQL find_in_set().这里不需要为此使用正则表达式.语法如下-select *from yourTableName where find_in_set( ...

  2. 如何从字符串中删除最后一个字符?

    我想从字符串中删除最后一个字符. 我尝试这样做: public String method(String str) {if (str.charAt(str.length()-1)=='x'){str ...

  3. Java中如何输入一个字符

    在一次编写代码时需要让程序接收一个字符,当我写出scanner.next时,我惊奇的发现,Scanner类中没有定义读取char的方法!!! Java中的扫描器类支持nextInt(),nextLon ...

  4. 字符串中如何删除一个字符

    字符串中我们怎么删除一个字符 第一种办法,找到该字符,后面的字符挨个挨个往前移动.直接上代码: #include using namespace std; void deletestr_T(char ...

  5. c语言fgetc()函数(从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动)

    C 标准库 - <stdio.h> 文章目录 描述 声明 参数 返回值 实例 描述 C 库函数 int fgetc(FILE *stream) 从指定的流 stream 获取下一个字符(一 ...

  6. php 字符串 替换 最后,php如何替换字符串中的最后一个字符

    php替换字符串中的最后一个字符的方法是:可以通过preg_replace()函数来实现.该函数的语法为:[preg_replace(mixed $pattern, mixed $replacemen ...

  7. mysql获取下一条自增的id_mysql获取一个表中的下一个自增(id)值的方法

    mysql获取一个表中的下一个自增(id)值的方法 MySQL: Get next AUTO_INCREMENT value from/for table Note to self: To get t ...

  8. 1019. 链表中的下一个更大节点

    2020-05-15 1.题目描述 链表中的下一个更大节点 2.题解 我是将他转化为数组来求解下一个比它大的数 3.代码 /*** Definition for singly-linked list. ...

  9. mysql 获取递增id_如何在MySQL中获取下一个自动递增ID?

    MySQL具有AUTO_INCREMENT关键字来执行自动增量.AUTO_INCREMENT的起始值为1,这是默认值.每条新记录将增加1. 要获得MySQL中的下一个自动增量ID,我们可以使用MySQ ...

最新文章

  1. java编译器 Javac 编译原理
  2. ubuntu 安装 mongodb并修改仓库路径
  3. 割平面法只能求解纯整数规划吗_【DMC第四讲】整数规划
  4. 用python批量下载网络图片大全_实战干货:用 Python 批量下载百度图片!
  5. 为什么Spring的健康状况会再次下降,下降,上升,上升,上升和下降?
  6. 万字长文!不为人所知的分布式锁实现全都在这里了
  7. 《深入理解Java虚拟机》——垃圾收集器的具体实现
  8. 古老的话题:成本控制
  9. WORD表格中文字显示不完整怎么办?
  10. 程序员生涯之我见 找到自己的兴趣所在 (zz)
  11. 开始使用Power BI桌面
  12. php soap proxy host,php-PHP soap Could not connect to host
  13. mvn命令编译GeoServer源代码
  14. MySQL中的主键约束和外键约束
  15. Rust: HashMap的用法及其它
  16. 一个示例让你明白界面与数据分离
  17. 《我是一只IT小小鸟》
  18. 前端json格式转换
  19. 苹果手机计算机切换用户名,苹果ID如何切换账号?苹果手机切换ID登录使用教程...
  20. FFmpeg系列-2-命令行工具之FFmpeg

热门文章

  1. 为什么用python写爬虫_零基础,是怎么开始写Python爬虫的
  2. 织梦html权限设置,详细的Dede织梦目录权限安全设置教程
  3. android webservices 返回多行多列数据,NoahWeb实现表格多行多列
  4. java replacefirst第n_Java中replace()、replaceFirst()和replaceAll()区别
  5. Win11任务栏如何设置在顶部
  6. Win11语音助手怎么开启 Win11语音助手开启的方法
  7. AngularJS小结
  8. java自定义注解annotation记录操作日志
  9. 悖论对计算机科学影响,数学和计算机科学的核心逻辑悖论
  10. php oracle817,Oracle 817 For Linux/Unix安装文档-数据库专栏,ORACLE