C++中cin的用法详细 📅 2026/7/13 8:42:06 代码编译运行环境VS2012Win32Debug。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从标准输入读取数据时通常用到的方法有cincin.getcin.getline。2.1cin的用法cin可以连续从键盘读取想要的数据以空格、tab或换行作为分隔符。实例程序如下。123456789101112131415#include iostreamusingnamespacestd;intmain(){chara;intb;floatc;stringcinabc;couta b c endl;system(pause);return0;}在屏幕中一次输入a[回车]11[回车]5.56[回车]程序将输出如下结果注意1cin等价于cin.operator()即调用成员函数operator()进行读取数据。2当cin从缓冲区中读取数据时若缓冲区中第一个字符是空格、tab或换行这些分隔符时cin会将其忽略并清除继续读取下一个字符若缓冲区为空则继续等待。但是如果读取成功字符后面的分隔符是残留在缓冲区的cin不做处理。3不想略过空白字符那就使用 noskipws 流控制。比如cinnoskipwsinput;验证程序见如下12345678910111213141516171819#include string#include iostreamusingnamespacestd;intmain(){chara;intb;floatc;string str;cinabcstr;couta b c strendl;string test;getline(cin,test);//不阻塞couttest:testendl;system(pause);return0;}从键盘输入:[回车][回车][回车]a[回车]5[回车]2.33[回车]hello[回车]输出结果是从结果可以看出cin对缓冲区中的第一个换行符视而不见采取的措施是忽略清除继续阻塞等待缓冲区有效数据的到来。但是getline()读取数据时并非像cin那样忽略第一个换行符getline()发现cin的缓冲区中有一个残留的换行符不阻塞请求键盘输入直接读取送入目标字符串后再将换行符替换为空字符\0因此程序中的test为空串。2.2 cin.get的用法该函数有有多种重载形式分为四种格式无参一参数二参数三个参数。常用的的函数原型如下1234intcin.get();istream cin.get(char var);istream get (char* s, streamsize n );istream get (char* s, streamsize n,chardelim;其中streamsize 在VC中被定义为long long型。另外还有两个重载形式不怎么使用就不详述了函数原型如下12istream get ( streambuf sb);istream get ( streambuf sb,chardelim );2.2.1 cin.get读取一个字符读取一个字符可以使用cin.get或者cin.get(var)示例代码如下12345678910111213#include iostreamusingnamespacestd;intmain(){chara;charb;acin.get();cin.get(b);coutabendl;system(pause);return0;}输入e[回车]输出注意1从结果可以看出cin.get()从输入缓冲区读取单个字符时不忽略分隔符直接将其读取就出现了如上情况将换行符读入变量b输出时打印两次。2cin.get()的返回值是int类型成功读取字符的ASCII码值遇到文件结束符时返回EOF即-1Windows下标准输入输入文件结束符为CtrlzLinux为Ctrld。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表示目标空间的大小。示例代码如下12345678910111213#include iostreamusingnamespacestd;intmain(){chara;chararray[20]{NULL};cin.get(array,20);cin.get(a);coutarray (int)aendl;system(pause);return0;}输入123456789[回车]输出注意1从结果可以看出cin.get(array,20);读取一行时遇到换行符时结束读取但是不对换行符进行处理换行符仍然残留在输入缓冲区。第二次由cin.get()将换行符读入变量b打印输入换行符的ASCII码值为10。这也是cin.get()读取一行与使用getline读取一行的区别所在。getline读取一行字符时默认遇到\n时终止并且将\n直接从输入缓冲区中删除掉不会影响下面的输入处理。2cin.get(str,size);读取一行时只能将字符串读入C风格的字符串中即char*但是C的getline函数可以将字符串读入C风格的字符串中即string类型。鉴于getline较cin.get()的这两种优点建议使用getline进行行的读取。关于getline的用法下文将进行详述。2.3 cin.getline读取一行函数作用从标准输入设备键盘读取一串字符串并以指定的结束符结束。函数原型有两个12istream getline(char* s, streamsize count);//默认以换行符结束istream getline(char* s, streamsize count,chardelim);使用示例1234567891011#include iostreamusingnamespacestd;intmain(){chararray[20]{NULL};cin.getline(array,20);//或者指定结束符使用下面一行//cin.getline(array,20,\n);coutarrayendl;system(pause);return0;}注意cin.getline与cin.get的区别是cin.getline不会将结束符或者换行符残留在输入缓冲区中。3. cin的条件状态使用cin读取键盘输入时难免发生错误一旦出错cin将设置条件状态(condition state)。条件状态标识符号为:goodbit:无错误eofbit:已到达文件尾failbit:非致命的输入/输出错误可挽回badbit:致命的输入/输出错误,无法挽回若在输入输出类里.需要加iOS::标识符号。与这些条件状态对应的就是设置、读取和判断条件状态的流对象的成员函数。他们主要有s.eof()若流s的eofbit置位则返回trues.fail()若流s的failbit置位则返回trues.bad()若流s的badbit置位则返回trues.good()若流s的goodbit置位则返回trues.clear(flags)清空状态标志位并将给定的标志位flags置为1返回void。