C++中cin.get(),cin.getline(),cin>>,gets(),cin.clear()使用总结
1.cin.get() 实质:类istream所定义对象cin的重载成员函数
用于读取单字符 istream& get(char&) int get(void)
用于读取字符串 istream &get(char*,int) istream &get(char*,int,char)
1.1 istream& get(char&)
Point1 返回一个指向用于调用它的istream类引用,可以读取空格符,制表符,换行符(以下对这三种字符统称空白)。如下所示分别输入三种字符时照样读取。这一点不同于cin>>。其将跳过空白,无法读取。如下所示输入的三个字符依次是空格符制表符和换行符。
Point2 由于返回的是调用对象cin,故cin.get()的读取还可以这样写
cin.get(ch1).get(ch2)>>ch3;
先将第一个字符(包括空白)给ch1返回调用对象cin。代码缩减为cin.get(ch2)。接着第二个字符(含空白)给ch2。接着代码缩减为cin>>ch3,此时将下一个非空白键字符给ch3。如下图所示:输入的字符依次为为空格符,制表符,‘6’。
Point3 如果cin.get(char&)到达文件结尾,它不给参数赋值,此时还将调用setstate(failbit)导致cin的结果为false,也就是说,可以将存在有效输入作为while循环的条件。如下:
char ch;
while(cin.get(ch))//若存在有效输入,返回值为对象cin,判断结果为true
{expression……; }
1.2 int get(void)
Point1 能够读取空白(空格,制表,换行)赋值给字符变量,返回类型为int。使用方法 char ch; ch=cin.get();
Point2 不能够使用如1.1中cin.get().get().get()……的形式来简写读取多个字符,原因为cin.get()返回为int值而并非对象。但下面的写法是正确的:
char ch1;
cin.get(ch1).get();
此时先返回对象cin,程序缩减为cin.get()。这里程序将读取并丢弃输入流中第二个输入字符(包含空白)。如下所示。依次输入为“chb”的结果;
实际上,在cin这个对象里,有一个储存字符的流,可以想象成缓冲区,事实上是cin里封装的一个东西.当我们在程序上输入字符后,对象cin获得了我们输入的字符。例如获得"chb回车",然后再通过cin.get()把流里面的第一个字符'c'抽取并从输入流中去掉,赋给ch1,这时,cin里储存的流的数据为"hb回车",此时cin.get(ch1).get()缩减为cin.get(),程序将抽取字符“h”并将其从输入流中去掉。这是输入流中剩下“b回车”,b被读取赋ch2。
Point3 一旦到达文件尾(不管是真正文件尾还是模拟的文件尾),cin.get(void)将返回值EOF---iostream中提供的符号常量(值为-1)。因此也可以用作控制条件;如下:
int ch;//注意声明为char,EOF可能无法用char类型来表示
while((ch=cin.get())!=EOF)
{ expression;……}
总结:希望程序检查每一个输入的字符(包括空白,尤其是换行符'\n'),请用get(),而需要跳过空白,可用抽取运算符“>>".get().类似C语言中的getchar(),类似的cout.put()类似putchar()。
1.3 istream &get(char*,int)和 istream &get(char*,int,char)
第一个参数为放置存储字符串的内存单元的地址,第二个参数为比需要读取的字符数大1的int值(显然额外的字符用于自动添加的字符串的结尾空字符),第三个字符为分界符,表示读到此不在读,若此处缺省即第一种情况,默认分界符为换行符。get()读到换行符或者分界符或者达到需要读取字符的数目后后立即终止读入。
如图输入"abcdEFG空格H制表I*^j换行"。"abcd"存储进str1,但分解字符'E'没有被读入并且仍旧留在输入流中(getline()也不读入但是会将其从输入流中删除)。E被读入到指针p所指向的空间,这里注意到“空格和制表均被被读取”。
2. istream &getline(char*,int) istream &getline(char*,int,char)
get()和getline()的区别是,前者将分界符保存在输入流中,后者则抽取并丢弃。如下图所示,分界符’E‘被丢弃。同样的,空格符和制表符被正常读入。这里对分界符做两种情况下的区分说明,倘若没有定义分界符,即get()和getline()为两个参数的情况,那么分界符缺省定义为换行符'\n';倘若定义了分解符,假设为‘\*’,即get()和getline()为三个参数的情况,那么换行符将作为一个正常字符输入,这一点在从外部文件中读取数据时值得注意。假设外部txt文件存储有一个二维char数组(3*100)的值(分3行),使用ifstream读入的时候,要考虑iftream.get()在分界符定义了的情况下将会将换行符读入,可能造成错误。
并且这里一定要考虑。getline()从输入流中提取并删掉分解符,而get()则只提取不删掉,尤其当分界符缺省为'\n'时,分界符会被写入下一个字符串的第一个位置。这里也有getline(cin,str1)一类的用法。包含于“#include<string>”。如下:
#include<iostream>
#include<string>
using namespace std;
void main ()
{
string str;
getline(cin,str);
cout<<str<<endl;
} 输入:jkljkljkl
输出:jkljkljkl 输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl
3.cin>>
不管是输入字符或者字符串,所有空白(空格符,制表符,换行符)均被跳过(从输入流中抽取并删去但不写入字符或者字符串)。这一点区别于前两种输入方法,因为最起码空格符和制表符正常读取。如下图的输入流中含空格符和制表符。为了看清楚每一次具体的输出,用“-”来标示。不想略过空白字符,那就使用
noskipws 流控制cin>>noskipws>>data;
4.gets()
原型为char*gets(char*buffer);输入的时候以换行符作为结束,空格键和制表符正常写入。由于此函数不会检查是否溢出,应保证buffer空间足够。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序。
5.cin.clear()
cin>>发生错误输入的时候,failbit被设置为1,只有用clear()将failbit修改到原来的状态0,输入才得以继续。
注意输入的是"12*34制表78换行",抽取运算符号>>在碰到错误输出时候,该错误字符仍旧留在输入流中,否则最后输出的就是”8“了,这里cin.get()会抽取并从输入流中删去错误的输入字符,保证输入得以继续。cin.peek()函数能够从输入流中提出一个字符,但是不会删去该字符,一般做字符检查之用。
6.cin.peek()
该调用形式为cin.peek() 其返回值是一个char型的字符,其返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)。其功能是从输入流中读取一个字符
但该字符并未从输入流中删除若把输入流比作一个 栈类 那么这里的peek函数就相当于栈的成员函数front 而如果cin.get()则相当于栈的成员函数pop。
#include "stdafx.h"
#include"iostream"
using namespace std;
int main() {
int s[3];
int i=0;
while(i<3)
{
if(cin.peek()=='#') cin.get();
cin>>s[i];
i++;
}
cout<<s[0]<<" "<<s[1]<<" "<<s[2];
}
若输入12#34356#,则输出12 34 56
本文部分参考自 C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
C++中cin.get(),cin.getline(),cin>>,gets(),cin.clear()使用总结的更多相关文章
- c++中获取字符cin,getchar,get,getline的区别
http://www.imeee.cn/News/GouWu/20090801/221298.html cin.get()与getchar()函数有什么区别? 详细点..C++中几个输入函数的用法和区 ...
- string中getline,cin的方法getline(),get总结
一.string中的getline不是string的成员函数,属于全局函数,使用需要include<string>,有两个重载版本: 函数原型参见:http://www.cplusplus ...
- C++获取字符cin,getchar,get,getline的区别
原创作品,转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5241544.html 1.cin>> 1)最常见的是获取输入的一个字符或数字,如 in ...
- 关于scanf 与 cin gets(),getline()......输入输出字符串的区别
很对人对于字符串的输入输出一直是比较模糊的,今天总结一下几个常用的输入流符号对于输入字符串时的区别: 1.scanf(),首先 它遇到空格或回车键(\n)就会结束,并且会将回车符算入字符串中: 2.c ...
- C++ cin.get及getline的用法
1.cin.get() 从指定的输入流中提取一个字符,函数的返回值就是这个字符.文件结束符会返回EOF,一般以-1代表EOF. #include<iostream> using names ...
- 注意当cin.getline、和cin 合用的时候
1. getline有两种,一个是string的(getline(cin,s)),一个是istream的(cin.getline(s,maxsize,delim)). 2. 当用cin输入了数据后,在 ...
- 关于cin, cin.get(), getchar(),getline()的字符问题
一.getchar()和cin.get() getchar()会将开头的空格或者回车作为输入 1 #include<iostream> 2 using namespace std; 3 i ...
- c++中的printf、和cout和cin后面跟指针的问题
printf里面打印指针的问题 而在c语言中,使用printf只需要使用不同的格式就可以区分打印出是字符串还是指针变量的值: cout和cin后面跟指针的问题 cout<<mm 和cin& ...
- cin 和scanf,scanf比cin快很多
//#include <iostream> #include <stdio.h> //#include <fstream> //using namespace st ...
- C++ : cin.get()函数和cin函数的使用
笔者由于自己忘记了cin函数怎么用,所以这里趁自己复习C++的空子正好可以做做记录. 1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include ...
随机推荐
- spring: ?.运算符
?.运算符 对于被调用方法的返回值来说,我们同样可以调用它的方法.例如,如果selectArtist()方法返回的是一个String,那么可以调用toUpperCase()将整个名字改为大写字母形式: ...
- Java 框架
Netty: Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Netty ...
- MySQL 分区知识点(一 )
前言: 查了下资料,关于 MySQL 分区的博文讲的详细的比较少,也不全,只好在官网去翻译英文文章看了.大体整理了一下记录起来: MySQL 分区类型: 1.RANGE 分区: // 这种类型的分区基 ...
- sklearn.preprocessing.StandardScaler 离线使用 不使用pickle如何做
Having said that, you can query sklearn.preprocessing.StandardScaler for the fit parameters: scale_ ...
- 28 python 并发编程之多进程
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...
- 是因为Session只能让服务器在一次连续的会话中记住你,而Cookie是记住浏览器一段时间
Cookie的作用 因为http协议先天不足是无记忆性. 还有一个区别是:Session是服务器端保存会话状态的机制. 而Cookie则是浏览器端保存会话的机制. Cookie 的应用
- python的单例模式--解决多线程的单例模式失效
单例模式 单例模式(Singleton Pattern) 是一种常用的软件设计模式,主要目的是确保某一个类只有一个实例存在.希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场 比如,某个 ...
- EJB到底是什么,真的那么神秘吗?? (转)
1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么 ...
- Oracl使用总结二
1.ORA-00972: 标识符过长 错误排除 可能原因: 1.如果是拼接成的sql语句,请查找传递参数时字符型字段是否两边少了引号.2.数据库表名太长了,附各种类型的数据库表名长度: SQLSERV ...
- Java实现Stack类
Java实现Stack类 import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Sc ...