C++中cin的详细用法

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.get

2.1 cin>>的用法

复制代码
#include <iostream>
using namespace std;

int main()
{
//    cin可以连续从键盘读取想要的数据,以空格、tab或换行作为分隔符。实例程序如下
    char a;
    int b;
    float c;
    cin>>a>>b>>c;
    cout<<a;
    cout<<b;
    cout<<c;
//    cout<<a<<" "<<b<<" "<<c<<" "<<endl;
    system("pause");
    return 0;
}
复制代码

在屏幕中一次输入:t空格12空格12.1空格,程序将输出如下结果:

注意:
(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;
    system("pause");
    return 0;
}
复制代码

 

输入:回车回车回车回车q回车12回车123.2回车www回车

从结果可以看出,cin>>对缓冲区中的第一个换行符视而不见,采取的措施是忽略清除,继续阻塞等待缓冲区有效数据的到来。

复制代码
#include <string> 
#include <iostream>
using namespace std;

int main()
{
    string test;
    getline(cin,test);//不阻塞
    cout<<"test:"<<test<<endl;
    system("pause");
    return 0;
}
复制代码

 

但是,getline()读取数据时,并非像cin>>那样忽略第一个换行符,getline()发现cin的缓冲区中有一个残留的换行符,不阻塞请求键盘输入,直接读取,送入目标字符串后,再将换行符替换为空字符’\0’,因此程序中的test为空串。

输入:回车

未知长度的一组整型数据读入

复制代码
#include<iostream>
using namespace std;
int main() {
//未知长度的整型数据读入 int i; while (cin>>i) { cout << i << endl; } }
复制代码

 

2.2 cin.get的用法

(1)cin.get读取一个字符

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

复制代码
#include <iostream>
using namespace std;

int main()
{
    char a;
    cin.get(a);//不阻塞
    cout<<"a:"<<a<<endl;
    system("pause");
    return 0;
}
复制代码

 输入:qqq回车 输出:q

(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;
}
复制代码

输入:wqsr回车 输出:wqsr

 

posted @   Q星星  阅读(1953)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示