news 2026/7/13 8:42:01

C++中cin的用法详细

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++中cin的用法详细

代码编译运行环境:VS2012+Win32+Debug。

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或换行作为分隔符。实例程序如下。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#include <iostream>

usingnamespacestd;

intmain()

{

chara;

intb;

floatc;

string

cin>>a>>b>>c;

cout<<a<<" "<<b<<" "<<c<<" "<<endl;

system("pause");

return0;

}

在屏幕中一次输入:a[回车]11[回车]5.56[回车],程序将输出如下结果:

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

验证程序见如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include <string>

#include <iostream>

usingnamespacestd;

intmain()

{

chara;

intb;

floatc;

string str;

cin>>a>>b>>c>>str;

cout<<a<<" "<<b<<" "<<c<<" "<<str<<endl;

string test;

getline(cin,test);//不阻塞

cout<<"test:"<<test<<endl;

system("pause");

return0;

}

从键盘输入:[回车][回车][回车]a[回车]5[回车]2.33[回车]hello[回车],输出结果是:

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

2.2 cin.get的用法

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

1

2

3

4

intcin.get();

istream& cin.get(char& var);

istream& get (char* s, streamsize n );

istream& get (char* s, streamsize n,chardelim;

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

1

2

istream& get ( streambuf& sb);

istream& get ( streambuf& sb,chardelim );

2.2.1 cin.get读取一个字符

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

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <iostream>

usingnamespacestd;

intmain()

{

chara;

charb;

a=cin.get();

cin.get(b);

cout<<a<<b<<endl;

system("pause");

return0;

}

输入: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表示目标空间的大小。示例代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <iostream>

usingnamespacestd;

intmain()

{

chara;

chararray[20]={NULL};

cin.get(array,20);

cin.get(a);

cout<<array<<" "<<(int)a<<endl;

system("pause");

return0;

}

输入:123456789[回车],输出:

注意:

(1)从结果可以看出,cin.get(array,20);读取一行时,遇到换行符时结束读取,但是不对换行符进行处理,换行符仍然残留在输入缓冲区。第二次由cin.get()将换行符读入变量b,打印输入换行符的ASCII码值为10。这也是cin.get()读取一行与使用getline读取一行的区别所在。getline读取一行字符时,默认遇到'\n'时终止,并且将'\n'直接从输入缓冲区中删除掉,不会影响下面的输入处理。

(2)cin.get(str,size);读取一行时,只能将字符串读入C风格的字符串中,即char*,但是C++的getline函数可以将字符串读入C++风格的字符串中,即string类型。鉴于getline较cin.get()的这两种优点,建议使用getline进行行的读取。关于getline的用法,下文将进行详述。

2.3 cin.getline读取一行

函数作用:从标准输入设备键盘读取一串字符串,并以指定的结束符结束。
函数原型有两个:

1

2

istream& getline(char* s, streamsize count);//默认以换行符结束

istream& getline(char* s, streamsize count,chardelim);

使用示例:

1

2

3

4

5

6

7

8

9

10

11

#include <iostream>

usingnamespacestd;

intmain()

{

chararray[20]={NULL};

cin.getline(array,20);//或者指定结束符,使用下面一行

//cin.getline(array,20,'\n');

cout<<array<<endl;

system("pause");

return0;

}

注意,cin.getline与cin.get的区别是,cin.getline不会将结束符或者换行符残留在输入缓冲区中。

3. cin的条件状态

使用cin读取键盘输入时,难免发生错误,一旦出错,cin将设置条件状态(condition state)。条件状态标识符号为:
goodbit:无错误
eofbit:已到达文件尾
failbit:非致命的输入/输出错误,可挽回
badbit:致命的输入/输出错误,无法挽回
若在输入输出类里.需要加iOS::标识符号。与这些条件状态对应的就是设置、读取和判断条件状态的流对象的成员函数。他们主要有:
s.eof():若流s的eofbit置位,则返回true;
s.fail():若流s的failbit置位,则返回true;
s.bad():若流s的badbit置位,则返回true;
s.good():若流s的goodbit置位,则返回true;
s.clear(flags):清空状态标志位,并将给定的标志位flags置为1,返回void。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 8:41:49

AI画布技术如何革新室内设计:从空间理解到实时生成

室内设计行业正面临一个核心痛点&#xff1a;传统设计流程中&#xff0c;从概念到效果图需要数天甚至数周时间&#xff0c;设计师需要反复修改方案&#xff0c;客户也难以直观理解最终效果。而AI技术的出现正在彻底改变这一现状&#xff0c;但市面上的AI设计工具大多停留在简单…

作者头像 李华
网站建设 2026/7/13 8:41:48

Linux下Milvus向量数据库故障的系统化排查Shell脚本

#!/bin/bash # # 脚本名称: milvus_diagnose_native.sh # 描述: 哲学优化 Milvus 向量数据库故障排查脚本【Linux原生安装 无Docker版】 # 适配&#xff1a;Systemd托管 / 二进制手动启动 Milvus 单机分布式组件 # 特性&#xff1a; # 1. 代码分段可单独复制终端逐…

作者头像 李华
网站建设 2026/7/13 8:38:02

LL(1) 与 LR(1) 文法对比:3个关键差异与5个典型语法设计案例

LL(1) 与 LR(1) 文法对比&#xff1a;3个关键差异与5个典型语法设计案例在编译器设计与实现中&#xff0c;语法分析是核心环节之一。LL(1)和LR(1)作为两种主流的语法分析方法&#xff0c;各自拥有独特的优势与适用场景。本文将深入探讨它们的本质区别&#xff0c;并通过实际案例…

作者头像 李华
网站建设 2026/7/13 8:35:55

通俗理解测试开发工程师视角下的CI/CD 工程师和运维工程师

CI/CD 工程师和运维工程师是软件工程“交付”和“运行”环节的核心角色。理解他们是谁、做什么&#xff0c;有助于测试开发工程师更清楚地知道自己的测试平台为什么、以及如何接入他们的系统。 一、CI/CD 工程师的工作职责是什么&#xff1f; 一句话概括&#xff1a;负责搭建和…

作者头像 李华
网站建设 2026/7/13 8:35:02

3分钟解锁网易云音乐:ncmdump让你的NCM文件自由呼吸

3分钟解锁网易云音乐&#xff1a;ncmdump让你的NCM文件自由呼吸 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾为网易云音乐下载的歌曲只能在特定客户端播放而感到束手无策&#xff1f;那些被加密的NCM格式音乐文件&#x…

作者头像 李华
网站建设 2026/7/13 8:31:36

3分钟学会ncmdump:免费解锁网易云NCM音乐格式的完整指南

3分钟学会ncmdump&#xff1a;免费解锁网易云NCM音乐格式的完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲&#xff0c;却发现只能在官方App里播放&#xff1f;那些被加密的NCM格式…

作者头像 李华