总结:C++中用cin对象进行字符和字符串的输入几种方法

几个概念

1)cin是istream类的一个对象
2)cin对象将标准输入表示为字节流,通常情况下,通过键盘来生成这种字符流
3)istream重载了抽取运算符>>,用于从输入流中抽取字符
通常可以这样使用:cin >> value_holder;
其中value_holder为存储输入的内存单元,它可以是变量,引用,解除引用的指针,也可以是类或结构的成员。
4)格式化输入函数:可以将输入数据转换为目标指定的格式
5)抽取运算符 >>属于格式化输入函数
经典的运算符函数原型 :istream& operator >> (int &);
即传入参数为某类型(int / double / char / char* 等)的引用,返回值为istream类型的引用
由于返回值为调用对象的引用,则可以直接修改参数的变量的值,并且,这使得能够将输入拼接起来,如:cin >> a >> b >> c;

注意:

抽取运算符>>跳过空白(空格、换行符、制表符)!!! ,直到遇到非空白字符。

单字符输入

(1)成员函数get(char&)
传入参数为char类型的引用,返回值类型为调用它的istream对象,这意味着 可以拼接 get(char&)后面的其它抽取,如:

char c1, c2, c3;
cin.get(c1).get(c2) >> c3;      

如果cin.get(char&)到达文件尾----无论是真正的文件尾,还是通过键盘仿真的文件尾(对于Windows命令提示符模式和DOS,为按下Ctrl + Z;对于UNIX,是在首行按下Ctrl + D),它都不会给参数赋值。另外,该方法还调用setstate(failbit),导致cin的测试结果为false:

char ch;
while (cin.get(ch)) {
	//程序
}

只要存在有效输入,cin.get(ch)的返回值都将是cin,此时的判定结果为true,因此循环将继续。到达文件尾时,返回值判定为false,循环终止。

(2)成员函数get()
没有传入参数,返回值类型为int(或某种更大的整型,这取决于字符集和区域),因此不可以拼接!

char ch;
ch = cin.get();

到达文件后(不管是真的文件尾还是模拟的文件尾),cin.get()都将返回值EOF—头文件iostream提供的一个符号常量。这种设计特性使得可以这样来读取输入:

int ch;		//注意:这里ch的类型为int,而不是char,因为值EOF可能无法使用char类型来表示。
while ((ch = cin.get()) != EOF) {
		//程序
}
注意事项:

在使用char参数 get(char) 或没有参数 get() 的情况下,get()方法读取下一个输入字符,即使该字符是空格、制表符或换行符即:不会跳过空白字符(空格、换行符、制表符)!!!

特征cin.get(ch)ch = cin.get()
传输输入字符的方法赋给参数 ch将函数返回值赋给 ch
字符输入时函数的返回值指向 istream 对象的引用字符编码(int值)
到达文件尾时函数的返回值转换为falseEOF

采用哪种单字符输入形式?

首先,应确定是否希望跳过空白,如果跳过空白方便,则使用抽取运算符>>
如果希望程序检查每个字符,应使用get()方法
,例如,计算字数的程序可以使用空格来判断单词何时结束。在get()方法中,get(char&)的接口更佳。没有参数的get()主要优点是,它与标准C语言中getchar()函数极其类似,这意味着可以通过包含iostream()(而不是stdio.h),并使用cin.get()替换所有的getchar(),用cout.put(ch)替换所有的putchar(char),来将C程序转换为C++程序

字符串输入

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

第一个参数,用于放置输入字符串的内存单元的地址
第二个参数,比读取的最大字符数大1(额外的一个字符用于存储结尾的空字符,以便将输入存为一个字符串)
第三个参数,指定用于作为分界符的字符,只有两个参数的版本将换行符用作分界符。
上述4个函数都在读取最大数目的字符或遇到换行符后为止。

注意区别:

get()将分界符留在输入流中,这样接下来的输入操作首先看到的将是分界符,而getline()抽取并丢弃输入流中的分界符
可以参考一下代码体会一下!

#include <iostream>
const int Limit = 255;

int main()
{
    using std::cout;
    using std::cin;
    using std::endl;

    char input[Limit];

    cout << "Enter a string for getline() processing:\n";
    cin.getline(input, Limit, '#');
    cout << "Here is your input:\n";
    cout << input << "\nDone with phase 1\n";

    char ch;
    cin.get(ch);
    cout << "The next input character is " << ch << endl;

    if (ch != '\n')
        cin.ignore(Limit, '\n');    // discard rest of line

    cout << "Enter a string for get() processing:\n";
    cin.get(input, Limit, '#');
    cout << "Here is your input:\n";
    cout << input << "\nDone with phase 2\n";

    cin.get(ch);
    cout << "The next input character is " << ch << endl;
/* keeping output window open */
/*
    cin.clear();
    while (cin.get() != '\n')
        continue;
    cin.get();
*/
    return 0; 
}

结果

方法行为
getline(char*, int)如果没有读取任何字符,如立刻达到了文件尾(但换行符被视为读了一个字符),则设置failbit ; 如果读取了最大数目的字符,且行中还有其它字符,则设置failbit
get(char*, int)如果没有读取任何字符,则设置failbit;如果读取了最大数目的字符则不设置failbit;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值