当前位置 博文首页 > zoukangdlut的博客:C++中cin的详细用法

    zoukangdlut的博客:C++中cin的详细用法

    作者:[db:作者] 时间:2021-08-15 13:32

    1.cin简介

    cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。

    在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。

    cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。


    2. cin的常用读取方法

    使用cin从标准输入读取数据时,通常用到的方法有cin>>,cin.get,cin.getline。

    2.1cin>>的用法

    cin可以连续从键盘读取想要的数据,以空格、tab或换行作为分隔符。实例程序如下。

    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a;
        int b;
        float c;
        string 
        cin>>a>>b>>c;
        cout<<a<<" "<<b<<" "<<c<<" "<<endl;
    
        system("pause");
        return 0;
    }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在屏幕中一次输入:a[回车]11[回车]5.56[回车],程序将输出如下结果:?
    这里写图片描述

    注意:?
    (1)cin>>等价于cin.operator>>(),即调用成员函数operator>>()进行读取数据。?
    (2)当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。?
    (3)不想略过空白字符,那就使用 noskipws 流控制。比如cin>>noskipws>>input;

    验证程序见如下:

    #include <string> 
    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a;
        int b;
        float c;
        string str;
        cin>>a>>b>>c>>str;
        cout<<a<<" "<<b<<" "<<c<<" "<<str<<endl;
    
        string test;
        getline(cin,test);//不阻塞
        cout<<"test:"<<test<<endl;
        system("pause");
        return 0;
    }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    从键盘输入:[回车][回车][回车]a[回车]5[回车]2.33[回车]hello[回车],输出结果是:?
    这里写图片描述

    从结果可以看出,cin>>对缓冲区中的第一个换行符视而不见,采取的措施是忽略清除,继续阻塞等待缓冲区有效数据的到来。但是,getline()读取数据时,并非像cin>>那样忽略第一个换行符,getline()发现cin的缓冲区中有一个残留的换行符,不阻塞请求键盘输入,直接读取,送入目标字符串后,再将换行符替换为空字符’\0’,因此程序中的test为空串。

    2.2 cin.get的用法

    该函数有有多种重载形式,分为四种格式:无参,一参数,二参数,三个参数。常用的的函数原型如下:

    int cin.get();
    istream& cin.get(char& var);
    istream& get ( char* s, streamsize n );
    istream& get ( char* s,  streamsize  n, char delim )。
     
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    其中streamsize 在VC++中被定义为long long型。另外,还有两个重载形式不怎么使用,就不详述了,函数原型如下:

    istream& get ( streambuf& sb);
    istream& get ( streambuf& sb, char delim );
     
    • 1
    • 2
    • 1
    • 2

    2.2.1 cin.get读取一个字符

    读取一个字符,可以使用cin.get或者cin.get(var),示例代码如下:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a;
        char b;
        a=cin.get();
        cin.get(b);
        cout<<a<<b<<endl;
        system("pause");
        return 0;
    }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    输入:e[回车],输出:?
    这里写图片描述?
    注意:?
    (1)从结果可以看出,cin.get()从输入缓冲区读取单个字符时不忽略分隔符,直接将其读取,就出现了如上情况,将换行符读入变量b,输出时打印两次。

    (2)cin.get()的返回值是int类型,成功:读取字符的ASCII码值,遇到文件结束符时,返回EOF,即-1,Windows下标准输入输入文件结束符为Ctrl+z,Linux为Ctrl+d。cin.get(char var)如果成功返回的是cin对象,因此可以支持链式操作,如cin.get(b).get(c)。

    2.2.2 cin.get读取一行

    读取一行可以使用istream& get ( char* s, streamsize n )或者istream& get ( char* s, size_t n, streamsize delim )。二者的区别是前者默认以换行符结束,后者可指定结束符。n表示目标空间的大小。示例代码如下:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a;
        char array[20]={NULL}; 
        cin.get(array,20);
        cin.get(a);
        cout<<array<<" "<<(int)a<<endl;
        system("pause");
        return 0;
    }
     
    • 1
    • 2
    • 3
    • 4
    下一篇:没有了