一、string中的getline不是string的成员函数,属于全局函数,使用需要include<string>,有两个重载版本:

函数原型参见:http://www.cplusplus.com/reference/istream/istream/getline/

标准信息来自《c++primer》和《c++ primer plus》,另http://blog.csdn.net/vanwaals/article/details/5753556

http://blog.csdn.net/mylovepan/article/details/7940719

istream& getline (istream&  is, string& str, char delim);

istream& getline (istream&  is, string& str);

这两个getline读取cin流里的字符串到str中,直到遇到下列情况结束,并返回:

(a)、遇到文件结束符,如windows下模拟的ctrl+z,或无效输入

(b)、遇到换行符,即Enter,将换行符留在缓冲区中,留给下一个输入,并不存入str中,所以输出str,要自己添加endl来换行

(c)、遇到设备故障

如果第一个字符为换行符,getline也将结束,则str被置为空串。getline函数返回istream引用的对象,和cin一样也可以用作condition(条件,即有真假的表达式)。

如果输入的字符串过长呢,会大于str的存储空间吗?不会,str自动根据输入来调整大小。如何结束while(getline(cin,str))循环呢?可以使用ctrl+z

 #include<iostream>
#include<string>
using namespace std;
int main()
{
string line;
while(getline(cin,line))
cout<<line<<"$";
}

输入了三个字符串,每个用Enter结束输入,且输出没有换行,getline()不会忽略space、tab,遇到Enter就结束,那么换行符是否留在缓冲区呢?如果是,下次getline就会遇到该换行符,
导致结束。由于没有输入ctrl+z,循环条件一直为真,所以提示继续输入
gteline的第三个参数为分界符,用户可以自定义,任何有效的字符都可以,如#,默认的为Enter。
int main()
{
string s;
while(getline(cin,s,'#'))
cout<<s<<"$";
}

二、cin.getline,两个重载版本:

istream& getline(char* s, streamsize n);
istream& getline(char* s, streamsize n, char delim);

第一个参数为字符指针,第二个控制输入的最大字符(等于n-1,最后一个位置存'\0',以便把输入存为字符串),如果输入的字符串过长,会导致cin流状态无效

不能再输入,使用cin.clear()函数可以重设cin的状态为有效。两个函数读取分界符或最大数目的字符为止。注意:将cin.getline()将分界符或者换行符丢弃,即缓冲区不会

有分界符用于下一个输入。但是如果输入的字符串过长,余下的字符会留在缓冲区。

int main()
{
char c[];
cin.getline(c, );
cout << c;
}

输入超过了4个字符,存入c的只有三个字符

 int main()
{
char c[];
cin.getline(c, );
cout << c;
if (!cin) cout << "cin error" << endl;
cin.getline(c, );
}

cin状态已经无效,!cin为测试条件。所以下一条输入语句不执行,不再有输入提示。

int main()
{
char c[];
cin.getline(c, );
cout << c;
if (!cin) cout << "cin error" << endl;
cin.clear();
cin.sync();
cin.getline(c, );
cout << c << endl;
}

h

使用cin.clear()与cin.sync()(清空缓冲区),才可以继续输入“123”,由于n=3,只能读取2个字符。

三、cin.get():

istream& get(char *,int,char); istream& get(char*,int);

用于单字符输入的 istream& get(char&);int get();

这是个函数都是istream类的方法,需要对象cin才能调用,与string中的getline()不同。

cin.get()与cin.getline()的不同之处为:遇到换行符或分界符,get会留该字符在缓冲区,所以cin.get()的连续两次调用,后一次会读取缓冲区的字符,不会再请求输入。

char c[];
char a[];
cin.get(c,);
cin.get(a,);

这样cin.get()无法跨行输入,解决办法是使用get的变体,下面介绍两个新get函数:

istream &get(char&);int get();

第二个函数与c的库函数getchar()一样,可以替换后者;它的使用代码为:

char ch;
ch=cin.get();
while(ch !='\n')
{
cout<<ch;
ch=cin.get();
}

  

这两个get都用于单字符的输入,且space,tab,Enter都能输入。通过在cin.get(c,5)与cin.get(a,4)间插入cin.get()这条语句,读取了缓冲区的换行符,cin.get(a,4)

才能继续读取输入。

istream &get(char&)的使用方式为 char ch; cin.get(ch);由于返回的是istream对象,所以cinget(ch).get(ch2)>>c3运行正常。也可以用cin.get(ch)为循环的测试条件。

四、cin的特点

cin用于输入int ,char ,string 等基本类型,不能输入一行字符到str中。cin遇到space,tab,Enter会自动忽略,从缓冲区中丢弃,但是后续的输入会留在缓冲区,下一次的输入会直接从缓冲区读取数据。

int sum=0;
int n;
while(cin>>n,n!=20)
{
sum+=n;
}
cout<<sum<<endl;

  

换行输入space后又输入6,3,4,但是循环无法结束,此时输入20可以结束。

1+2+3+4+5+6+3+4=28。注意:while(cin>>a,a!=20)的测试条件是逗号表达式,值为逗号右边的子表达式,而不是cin>>a的返回值cin。

注意:如果int a;cin>>a;输入的不是整数,cin>>a是无效输入,不能再输入。

												

string中getline,cin的方法getline(),get总结的更多相关文章

  1. java基础---->String中replace和replaceAll方法

    这里面我们分析一下replace与replaceAll方法的差异以及原理. replace各个方法的定义 一.replaceFirst方法 public String replaceFirst(Str ...

  2. Java 字符串比较,String 中的一些方法 == 和 equals 的详解

    "==" 是比较的是两个对象的内存地址,而equals方法默认情况下是比较两个对象的内存地址. 1.String str = "hello"  生成的字符串,首 ...

  3. String中的==与Empty

    1.String中的==与Equals方法执行结果一样吗? 我们都知道对于引用类型"=="比较的是引用而不是具体的值,但c#中有一种神奇的叫做操作符重载的东西.官方对String类 ...

  4. Java中的==和equals( )方法

    在Java中,equals和==都是用于检测两个字符串是否相等,返回类型也都是boolean值,但是二者内部处理却不一样. ==与equals( ) ==在Java中是一个二元操作符,用于比较原生类型 ...

  5. C++中cin.get(),cin.getline(),cin>>,gets(),cin.clear()使用总结

    1.cin.get()  实质:类istream所定义对象cin的重载成员函数 用于读取单字符  istream& get(char&)    int get(void) 用于读取字符 ...

  6. C++中关于cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

    1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: 注意:>> 是会过滤掉不可见的字符(如 空格 回车,TAB 等) cin>>noskipws> ...

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

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

  8. nyoj 273-字母小游戏 (getline(cin, string))

    273-字母小游戏 内存限制:64MB 时间限制:1000ms 特判: No 通过数:16 提交数:24 难度:0 题目描述: 给你一个乱序的字符串,里面包含有小写字母(a--z)以及一些特殊符号,请 ...

  9. PAT 甲级 1050 String Subtraction (20 分) (简单送分,getline(cin,s)的使用)

    1050 String Subtraction (20 分)   Given two strings S​1​​ and S​2​​, S=S​1​​−S​2​​ is defined to be t ...

随机推荐

  1. mysql5.7.26部署MHA

    前期准备: mysql先部署好GTID主从,然后才部署MHA 1)环境准备(所有节点) #安装依赖包 yum install perl-DBD-MySQL -y #进入安装包存放目录 [root@my ...

  2. hdu4352 XHXJ's LIS[数位DP套状压DP+LIS$O(nlogn)$]

    统计$[L,R]$内LIS长度为$k$的数的个数,$Q \le 10000,L,R < 2^{63}-1,k \le 10$. 首先肯定是数位DP.然后考虑怎么做这个dp.如果把$k$记录到状态 ...

  3. 10.17小作业 基于TCP开发一款远程CMD程序

    基于TCP开发一款远程CMD程序 客户端连接服务器后,可以向服务器发送命令 服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端 注意: 执行系统指令使用subprocess ...

  4. JavaScript 正则表达式——预定义类,边界,量词,贪婪模式,非贪婪模式,分组,前瞻

    ㈠预定义类    示例:匹配一个ab+数字+任意字符的字符串:ab\d.   ㈡边界 正则表达式常用的边界匹配字符   ⑴示例1:第一个是没写单词边界             第二个是加上字符边界的效 ...

  5. jquery keypress() 方法 语法

    jquery keypress() 方法 语法 作用:keypress 事件与 keydown 事件类似.当按钮被按下时,会发生该事件.它发生在当前获得焦点的元素上.不过,与 keydown 事件不同 ...

  6. TensorFlow使用记录 (一): 基本概念

    基本使用 使用graph来表示计算任务 在被称之为Session的上下文中执行graph 使用tensor表示数据 通过Variable维护状态 使用feed和fetch可以为任意的操作(op)赋值或 ...

  7. Hexo + github pages + 阿里云绑定域名搭建个人博客

    申请域名 万网购买的域名,地址:https://wanwang.aliyun.com/domain/com?spm=5176.8142029.388261.137.LoKzy7 控制台进行解析 控制台 ...

  8. Link-Cut Tree(LCT) 教程

    目录 前置知识 介绍 Access FindRoot MakeRoot Split Link Cut 关于Splay中操作的一点说明: 模板 前置知识 请先对树链剖分和Splay有所了解.LCT基于树 ...

  9. LocalDateTime自动转化格式

    开发中,遇到这样的问题.一个LocalDateTime类型的属性返回给前端是中间带T的格式,前端说转不了. 可以引入jackson包转换一下 <properties> <jackso ...

  10. numpy小记

    import numpy as np # a=np.array([[1,3,2],[4,5,6]]) print(a) a=np.arange(1,13).reshape((3,4))#生成一个3行4 ...