C++中单字符与字符串的读取

1.单字符输入

两个成员函数:int get(void);   istream& get(char &ch)

这两个函数读取输入流中下一字符,即使该字符是空格、制表符、换行符等。

区别:遇到文件结束符EOF时int get(void);返回EOF,而 istream& get(char &ch)将返回转换为false;因此,get(ch)可以用来作为是否终止输入的条件,而get()不可以。

    istream& get(char &ch)可以拼接使用,而int get(void)不能拼接使用,但可以这样用:cin.get(ch).get() 用来丢弃一个字符(往往用来丢弃换行符'\n')。


>>抽取运算符

chin>>ch;会丢弃流中的空格(空格,换行,制表等),因此不能利用换行符作为输出结束进行判断。


两种单字符输入函数的对比:要处理特殊字符(不可显示的字符,如:空格,换行,制表等)必须使用两个get函数来处理,而 istream& get(char &ch)更高效。


2. 字符串输入

四个成员函数:

istream& get(char *, int, char)

istream& get(char *,int)

istream& getline(char*, int, char)

istream& getline(char *, int) 

第一个参数:用于放置字符串的内存单元地址

第二个参数:读取的最大字符数加1

第三个参数:指定字符串间的分界符


以上四个函数的区别:

get 和 getline 函数的区别在于:cin.get(ch..)将分隔符保留在流中,而cin.getline(ch...)会从流中抽取分隔符并丢弃。因此使用cin.get(...)输入字符串时往往这么使用:cin.get(ch...).get() 用来丢弃分隔符,负责分隔符将停留在流中,阻止了下一次cin.get(ch...)对流的抽取。

当输入达到文件结尾时,get与getline都会因无法抽取字符而将空置写入到字符串中。但当输入一行空行时,get函数将设置failbit位,而getline将抽取换行符,但丢弃它,即不存储它。

char temp[80];

while(cin.get(temp,80)){.....} 空行将终止输入

while(cin.getliine(temp,80) && temp[0] != '\0' ){....}  空行亦可终止输入


string类字符串输入:

getline(istream&,string);

该方法以istream作为参数,自动调整string大小,使其能够刚好存储输入的字符,因此不需要指定读取多少字符的数值参数。该方法也可指定分隔字符。


对于string 类型的字符串对象,使用getline(cin,string&)进行输入。


eg1.

#include <iostream>

using namespace std;

int main()

{

    char ch[3][10];

    int i=0;

    while(i<3){

     cin.get(ch[i],10,',').get();

     i++;

    }

    for(i=0;i<3;i++)        cout << i << ": " << ch[i] << endl;

    return 0;

}

eg2.

#include <iostream>

using namespace std;

int main()

{

    char ch[3][10];

    int i=0;

    while(i<3){

     cin.getline(ch[i],10,',');

     i++;

    }

    for(i=0;i<3;i++)        cout << i << ": " << ch[i] << endl;

    return 0;

}

eg1 与 eg2 等效。因为cin.get(ch..)将分隔符保留在流中,而cin.getline(ch...)会从流中抽取分隔符并丢弃。

3 字符串异常输入

get(char*,int)和getline()的某些输入形式会影响流状态。在遇到文件尾时会置位eofbit,遇到流被破坏(设备故障)会设置badbit。

在有无字符串输入、输入字符串达到或超过最大字符数时,这两种函数对于流状态的影响不一致。

没有取得任何输入时:getline(..)和get(...)都会设置failbit。

但当读取数目的字符数大于最大数目,且行中还有其它字符,则设置failbit。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值