用法上剖析c++中的while(cin>>s)、getline,以及为stringstream打好基础

最近学习stringstream类,用途有取出字符串中特定字符,或者以特定字符为隔开

前提你得知道while(cin>>s)本质,以及getline基础

开始:

cin,cout是iostream类的实例,这个类分为istream,ostream,分别为输入流类和输出流类。

流理解成媒介,数据从一个地方转移到另一个地方的“中转站

stringstream也是一种输入输出流类。

iostream代表从“键盘缓冲区”作输入输出。

stringstream代表从“字符串”作输入输出。

本文重点讲述iostream基础用法,理解好了可以去进阶stringstream:【C++】stringstream类 最全超详细解析(什么是stringstream? stringstrem有哪些作用? 如何在算法中应用?)-优快云博客

1、先从while(cin>>s)说起:

      

string s;
while(cin>>s){
    cout<<s<<endl;
}

cin>>s 返回的是一个istream对象,正常返回istream对象,被while视为正确,进入循环体。

但是何时返回istream对象?

一、

        键盘缓冲区输入完成:"a bc d",按下回车enter(也充当最后的分隔符,不理解分隔符先继续往后看),cin输入流实例成为 "a bc d",缓冲区中有什么,cin输入流中就是什么。

二、

        对于普遍的输入流,执行cin>>s,代表数据流到具体对象中。正常情况下,非空格字符开始,遇到空格结束,并返回istream对象,此时while识别为true,第一次进入循环,此时的s="a"。

三、

        流的其中一个特点是用掉后就没了,第二次循环,原本流中的“a”用尽,开始向s流入"bc",知道遇到空格停止,进入循环。

四、

        如此反复,输入流中的所有内容,都分段地进入过s字符串,完成了流入操作

2、getline方法

    string s;
    while(getline(cin,s,' ')){
        cout<<s<<endl;
    }

        getline()的原型是istream& getline ( istream &is , string &str , char delim );

        与>>运算符一样,正常情况返回一个istream对象,while识别为true

        is是输入流,str是流入的具体对象 ======== is>>str

        所以is可以传入cin,因为cin就是键盘缓冲区的输入流,str传入s,最后等效为 ========= cin>>s

        完全一样!

        delim代表流入s时,遇到的中断字符(分隔符),如果是 ‘空格’ ,则和cin>>一样,以空格为中断。

3、特别一提

        并非只有当遇到中断符才结束一次流入,若

    char chr;
    while(getline(cin,chr,' ')){
        cout<<chr<<endl;
    }

同样键盘缓冲区输入完成:"a bc d",当“bc“”的‘’b‘’满足一次流入char类型,也会进入循环。下一次再让'c'进入。

4、总结

        istream相当于一个从缓冲区获取的总流,>>,getline()方法,类似于产生一段段子流,流入到具体对象中,子流划分默认用空格(最后回车此时也算),也可用getline指定用于划分的字符。

        产生的子流,没有while,就只能流入一次,通过while才能将全部子流流入。

        子流的最后必须要有分隔符,cin为默认情况下回车代替了分隔符空格。自定义的情况下必须补上,如:

string s2;
while(getline(cin,s2,',')){
        cout<<s2<<endl;
    }

输入:ssc,fd  sfd,fasd
结果为:
ssc
fd  sfd

输入:ssc,fd  sfd,fasd,
结果为:
ssc
fd  sfd
fasd

(最后的逗号不能少)

        流入的对象满了的情况,自动产生子流(如上述的3、特别一提)

        getline()只能用于流入的对象是string类型,自己回去看getline的参数类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值