cin.peek():C++查看输入流中的下一个字符
peek() 是 istream 类的成员函数,它的原型是:
cin.peek() 不会跳过输入流中的空格、回车符。在输入流已经结束的情况下,cin.peek() 返回 EOF。
在输入数据的格式不同,需要预先判断格式再决定如何输入时,peek() 就能起到作用。
例题:编写一个日期格式转换程序,输入若干个日期,每行一个,要求全部转换为“mm-dd-yyyy”格式输出。输入的日期格式可以是“2011.12.24”(中式格式),也可以是“Dec 24 2011”(西式格式)。要求该程序对于以下输入数据:
编写这个程序时,如果输入的是中式格式,就用 cin>>year(假设 year 是 int 类型变量)读取年份,然后再读取后面的内容;如果输入是西式格式,就用 cin>>sMonth(假设 sMonth 是 string 类型对象)读取月份,然后读取后面的内容。
可是,如果没有将数据从输入流中读取出来,就无法判断输入到底是哪种格式。即便用 cin.get() 读取一个字符后再作判断,也很不方便。例如,在输入为
示例程序如下:
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
编写这个程序时,如果输入的是中式格式,就用 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',输出宽度2 cout << "-" << setw(2) << day << "-" << setw(4) << year << endl; } return 0; }istream 还有一个成员函数 istream & putback(char c),可以将一个字符插入输入流的最前面。对于上面的例题,也可以在用 get() 函数读取一个字符并判断是中式格式还是西式格式时,将刚刚读取的字符再用 putback() 成员函数放回流中,然后再根据判断结果进行不同方式的读入。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算