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()使用总结的更多相关文章

  1. c++中获取字符cin,getchar,get,getline的区别

    http://www.imeee.cn/News/GouWu/20090801/221298.html cin.get()与getchar()函数有什么区别? 详细点..C++中几个输入函数的用法和区 ...

  2. string中getline,cin的方法getline(),get总结

    一.string中的getline不是string的成员函数,属于全局函数,使用需要include<string>,有两个重载版本: 函数原型参见:http://www.cplusplus ...

  3. C++获取字符cin,getchar,get,getline的区别

    原创作品,转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5241544.html 1.cin>> 1)最常见的是获取输入的一个字符或数字,如 in ...

  4. 关于scanf 与 cin gets(),getline()......输入输出字符串的区别

    很对人对于字符串的输入输出一直是比较模糊的,今天总结一下几个常用的输入流符号对于输入字符串时的区别: 1.scanf(),首先 它遇到空格或回车键(\n)就会结束,并且会将回车符算入字符串中: 2.c ...

  5. C++ cin.get及getline的用法

    1.cin.get() 从指定的输入流中提取一个字符,函数的返回值就是这个字符.文件结束符会返回EOF,一般以-1代表EOF. #include<iostream> using names ...

  6. 注意当cin.getline、和cin 合用的时候

    1. getline有两种,一个是string的(getline(cin,s)),一个是istream的(cin.getline(s,maxsize,delim)). 2. 当用cin输入了数据后,在 ...

  7. 关于cin, cin.get(), getchar(),getline()的字符问题

    一.getchar()和cin.get() getchar()会将开头的空格或者回车作为输入 1 #include<iostream> 2 using namespace std; 3 i ...

  8. c++中的printf、和cout和cin后面跟指针的问题

    printf里面打印指针的问题 而在c语言中,使用printf只需要使用不同的格式就可以区分打印出是字符串还是指针变量的值: cout和cin后面跟指针的问题 cout<<mm 和cin& ...

  9. cin 和scanf,scanf比cin快很多

    //#include <iostream> #include <stdio.h> //#include <fstream> //using namespace st ...

  10. C++ : cin.get()函数和cin函数的使用

    笔者由于自己忘记了cin函数怎么用,所以这里趁自己复习C++的空子正好可以做做记录. 1.cin>>          用法1:最基本,也是最常用的用法,输入一个数字: #include ...

随机推荐

  1. sp_rename sqlserver 表 列 索引 类型重命名

    --[语法] sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name' [ , [ @objtype = ] 'object ...

  2. poj2778 ac自动机+矩阵快速幂

    给m个子串,求长度为n的不包含子串的母串数,最直接的应该是暴搜,肯定tle,考虑用ac自动机 将子串建成字典树,通过next表来构造矩阵,然后用矩阵快速幂求长度为n的数量 邻接矩阵https://we ...

  3. nyoj-1132-promise me a medal(求线段交点)

    题目链接 /* Name:nyoj-1132-promise me a medal Copyright: Author: Date: 2018/4/26 20:26:22 Description: 向 ...

  4. php mysql 查询

    抓取结果集对象中数据并且转换数组 $row = mysqli_fetch_assoc(结果集对象); 从结果集对象中抓取一行记录->转换关联数组 $row = mysqli_fetch_row( ...

  5. CodeForces - 688C:NP-Hard Problem (二分图&带权并查集)

    Recently, Pari and Arya did some research about NP-Hard problems and they found the minimum vertex c ...

  6. Qt之事件处理机制

    思维导读 一.事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下 ...

  7. 【LeetCode】005. Longest Palindromic Substring

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  8. java向excel写数据

    package pymongo1; import java.io.File;import java.io.IOException;import java.io.OutputStream; import ...

  9. Python collections系列之有序字典

    有序字典(orderedDict ) orderdDict是对字典类型的补充,他记住了字典元素添加的顺序 1.创建一个有序字典 import collections dic = collections ...

  10. 【HTML代码】访问页面时,拨打页面中的电话号码

      这两天在写HTML页面今天要实现一个手机用户访问页面的时候,如果页面中有电话号码,点击可以打电话或者是发信息,之前没做过今天刚听说感觉很高大上会很难,实际上简单的让我内牛满面啊,,  小婊砸 (* ...