C++中cin如何输入cin字符串串

博客访问: 383610
博文数量: 136
博客积分: 893
博客等级: 中士
技术积分: 1001
注册时间:
生命可以终止,梦想不会!
分类: C/C++ 20:32:40
这篇文章主要讲解如何在C++中使用cin/cout进行高级的格式化输出操作,包括数字的各种计数法(精度)输出,左或右对齐,大小写等等。通过本文,您可以完全脱离scanf/printf,仅使用cin/cout来完成一切需要的格式化输入输出功能(从非性能的角度而言)。更进一步而言,您还可以在、上使用这些格式化操作,从而代替sscanf/sprintf和fscanf/fprintf函数。为方便描述,下文仅以cin/cout为例进行介绍。
控制符是在头文件iomanip.h中定义的对象。&使用前必须把iomanip.h包含进来
1.&I/O的书写格式 &I/0流是输入或输出的一系列字节,当程序需要在屏幕上显示输出时,可以使用插入操作符“<<”向cout输出流中插入字符。例如:
cout<<”This is a program.\n
当程序需要执行键盘输入时,可以使用抽取操作符“>>”从cin输人流中抽取字符。例如:   int&myAge;   cin>>myAge;  不管把什么基本数据类型的名字或值传给流,它都能懂。  例如,下面的函数输出字符串和整数:
#include <iostream.h>
{     
&&&&cout<<"My name is Jone\n";      cout<<"the ID is";     
&&&&cout<<2;     
&&&&cout<<endl;   
上面的输出也可以在同一行中串连,下面的输出语句与上例输出同样内容
cout <<"My name is Jone\n" <<”the ID is
也可以分在几行,提高可读性,下列语句与上例输出同样结果:    cout<<"My&name&is&Jone&n"&//行末无分号      <<"the&ID&is"      <<2      <<endl;  cin可以和cout一样的方式调整行,它自动识别变量位置和类型。例如:    int&i;float&f;long&l;    cin&>>i&>>f&>>l;  cin能够知道抽取的变量之类型,它将对i,f,l分别给出一个整型、浮点型和长整型数。2.使用控制符  流的默认格式输出有时不能满足特殊要求,如:
   double&average=9.400067;   cout<<average<<endl;
  希望显示的是9.40,即保留两位小数,可是却显示了9.40007;默认显示6位有效位。&用控制符(manipulators)可以对I/O流的格式进行控制。控制符是在头文件iomanip.h中定义的对象。可以直接将控制符插入流中。常用控制符如表2-4所列。
 表2-4&I/O流的常用控制符
dechexoctsetfill(c)setprecision(n)&setw(n)&setiosflags(ios::fixed)&setiosflags(ios::scientific)&setiosflags(ios::left)&setiosflags(ios::right)&setiosflags(ios::skipws)&setiosflags(ios::uppercase)&setiosflags(ios::lowercase)
置基数为10&置基数为16&置基数为8&没填充字符为c&没显示小数精度为n位&设域宽为n个字符固定的浮点显示&指数表示左对齐右对齐&忽略前导空白16进制数大写输出&16进制数小写输出
使用控制符时,要在程序的头上加头文件iomanip.h。
3.控制浮点数值显示  使用setprecision(n)可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6。  如果setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。setiosflags(ios::fixed)是用定点方式表示实数。&  如果与setiosnags(ios::scientific)合用,&可以控制指数表示法的小数位数。setiosflags(ios::scientific)是用指数方式表示实数。  例如,下面的代码分别用浮点、定点和指数方式表示一个实数:
#include <iostream.h>    
#include <iomanip.h> //要用到格式控制符
void main()   
&&&&double amount = 22.0/7;      
&&&&cout <<amount <<endl;      
&&&&cout <<setprecision(0)
&&&&<<amount <<endl      
&&&&<<setprecision(1) <<amount <<endl      
&&&&<<setprecision(2) <<amount <<endl      
&&&&<<setprecision(3) <<amount <<endl      
&&&&<<setprecision(4) <<amount <<endl;
  cout <<setiosflags(ios::fixed);      
&&&&cout <<setprecision(8) <<amount <<endl;
  cout <<setiosflags(ios::scientific)
&&&&<<amount <<endl;
 &&&&cout <<setprecision(6); //重新设置成原默认设置    
运行结果为:     3.14286     3     3     3.1     3.14     3.143     3.     3.
该程序在32位机器上运行通过。  在用浮点表示的输出中,setprecision(n)表示有效位数。  第1行输出数值之前没有设置有效位数,所以用流的有效位数默认设置值6:第2个输出设置了有效位数0,C++最小的有效位数为1,所以作为有效位数设置为1来看待:第3~6行输出按设置的有效位数输出。  在用定点表示的输出中,setprecision(n)表示小数位数。  第7行输出是与setiosflags(ios::fixed)合用。所以setprecision(8)设置的是小数点后面的位数,而非全部数字个数。  在用指数形式输出时,setprecision(n)表示小数位数。  第8行输出用setiosflags(ios::scientific)来表示指数表示的输出形式。其有效位数沿用上次的设置值8。  小数位数截短显示时,进行4舍5入处理。
4.设置值的输出宽度  除了使用空格来强行控制输出间隔外,还可以用setw(n)控制符。如果一个值需要比setw(n)确定的字符数更多的字符,则该值将使用它所需要的所有字符。例如:   float&amount=3.14159;   cout&<<setw(4)&<<amount&<<endl;  其运行结果为:3.14159。它并不按4位宽度,而是按实际宽度输出。  如果一个值的字符数比setw(n)确定的字符个数更少,则在数字字符前显示空白,不同于其他控制符,setw(n)仅仅影响下一个数值输出,换句话说,使用setw设置的间隔方式并不保留其效力。例如:    cout<<setw(8)      <<10      <<20<<endl;  运行结果为:      &-------1020  运行结果中的下横线表示空格。整数20并没有按宽度8输出。setw()的默认值为宽度0,即setw(0),意思是按输出数值的表示宽度输出,&所以20就紧挨10了。若要每个数值都有宽度8,则每个值都要设置:    cout<<setw(8)<<10    &<<setw(8)&<<20&<<endl;
5.输出8进制和16进制数  3个常用的控制符是hex,oct和dec,它们分别对应16进制、8进制和10进制数的显示。这3个控制符在iostream.h头文件中定义。例如:
    void&main()    {      int&number=1001;      cout&<<"Decimal:"&<<dec&<<number&<<endl      <<"Hexadecimal:"&<<hex&<<number&<<endl      <<"Octal:"&<<oct&<<number&<<    }
  运行结果为:      Decimal:1001      Hexadecimal:3e9      Octal:1751
1001是一个10进制数,不能把它理解成16进制或8进制数,因为它不是以0x或0开头。但在输出时,&流根据控制符进行过滤,&使其按一定的进制来显示。  用头文件iomanip.h中的setiosflags(ios::uppercase)可以控制16进制数大写输出。例如,上例中增加一个头文件,对16进制数进行大写控制,即:    #include    #include    //...
    cout<<"Hexadecimal:"<<hex      <<setiosftags(ios::uppercase)      <<number<<endl;  便能得到16进制数的大写表示:Hexadecimal:3E9。6.设置填充字符  setw可以用来确定显示的宽度。默认时,流使用空格符来保证字符间的正确间隔。用setfill控制符可以确定一个非空格的别的字符。Setfill在头文件iomanip·h中定义。例如:
#include <iostream.h>    
#include <iomanip.h>
void main()    
{      
&&&&cout <<setfill('*')        
&&&&<<setw(2) <<21 <<endl        
&&&&<<setw(3) <<21 <<endl        
&&&&<<setw(4) <<21 <<endl;
  cout <<setfill(' '); // 恢复默认设置    
运行结果为:      21      *21      **21
7.左右对齐输出  默认时,I/O流左对齐显示的内容。使用头文件iomanip.h中的setiosflags(ios::left)和(ios::right)标志,可以控制输出对齐。例如:
#include&    #include&
    void&main()    {    cout&<<setiosflags(ios::right)       <<setw(5)&<<1       <<setw(5)&<<2
       <<setw(5)&<<3&<<
    cout&<<setiosflags(ios::left)       <<setw(5)&<<1       <<setw(5)&<<2       <<setw(5)&<<3&<<    }
  运行结果为:    -----1-----2-----3    1-----2-----3-----
8.强制显示小数点和符号  当程序输出下面的代码时:    cout<<10.0/5<<endl;&  默认的I/0流会简单地显示2,而非2.0,因为除法的结果是精确的。当需要显示小数点时,可以用iso::showpoint标志。例如:
#include&    #include&
    void&main()    {    cout&<<10.0/5&<<
    cout&<<setiosflags(ios::showpoint)       <<10.0/5&<<    }
    运行结果为:      2      2.00000  默认时,I/O流仅在负数之前显示值的符号,根据程序的用途,有时也需要在正数之前加上正号,可以用ios::showpos标志。例如:
#include&    #include&
    void&main()    {    &cout&<<10&<<"&"&<<-20&<<
    &cout&<<setiosflags(ios::showpos)       <<10&<<"&"&<<-20&<<    }
  运行结果为:     10&-20     +10&-20小结   变量是程序分配给某个内存位置的名字,它可以存放信息。程序在使用变量前,必须先说明变量名和变量类型。  不同的变量不能同名,变量名应该尽量反映出变量的用途,以增强程序的可读性。  在程序运行中,常量的值不可改变。常量也有各种数据类型,也占有存储空间。各种数据类型的数据表示有一定的范围,越过了该范围,&C++就要对该数据进行截取,使得数据不再正确。  利用cout可以输出各种数据类型的数据,可以多种方式在屏幕上显示输出信息(包括特殊符号)。  C++兼容C的库函数,所以printf()和scanf()也可照常使用。
阅读(8574) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。c++中的各种输入操作符 cin,cin.get(),cin.getline()等函数用法总结
cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教1、cin
1、cin.get()
2、cin.getline()
3、getline()
5、getchar()
用法1:最基本,也是最常用的用法,输入一个数字:
#include&iostream&
cin&&a&&b;
cout&&a+b&&
输入:2[回车]3[回车]
用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束
#include&iostream&
char a[20];
输入:jkljkljkl
输出:jkljkljkl
输入:jkljkl jkljkl
//遇空格结束
输出:jkljkl
2、cin.get()
用法1: cin.get(字符变量名)可以用来接收字符
#include&iostream&
ch=cin.get();
//或者cin.get(ch);
cout&&ch&&
输入:jljkljkl
用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
#include&iostream&
char a[20];
cin.get(a,20);
输入:jkl jkl jkl
输出:jkl jkl jkl
输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd
(接收19个字符+1个'\0')
用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足.
这个我还不知道怎么用,知道的前辈请赐教;
3、cin.getline()
接受一个字符串,可以接收空格并输出
#include&iostream&
char m[20];
cin.getline(m,5);
输入:jkljkljkl
输出:jklj
接受5个字符到m中,其中最后一个为'\0',所以只看到4个字符输出;
如果把5改成20:输入:jkljkljkl输出:jkljkljkl
输入:jklf fjlsjf fjsdklf输出:jklf fjlsjf fjsdklf
//cin.getline()实际上有三个参数,cin.getline(接受字符串的看哦那间m,接受个数5,结束字符)
//当第三个参数省略时,系统默认为'\0'
//如果将例子中cin.getline()改为cin.getline(m,5,'a');当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk
当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:
#include&iostream&
#include&string&
char m[3][20];
for(int i=0;i&3;i++)
cout&&"\n请输入第"&&i+1&&"个字符串:"&&
cin.getline(m[i],20);
for(int j=0;j&3;j++)
cout&&"输出m["&&j&&"]的值:"&&m[j]&&
请输入第1个字符串:
请输入第2个字符串:
请输入第3个字符串:
输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3
4、getline()
接受一个字符串,可以接收空格并输出,需包含“#include&string&”
#include&iostream&
#include&string&
getline(cin,str);
cout&&str&&
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl
和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数
接受一个字符串,可以接收空格并输出,需包含“#include&string&”
#include&iostream&
#include&string&
char m[20];
//不能写成m=gets();
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jkl jkl
输出:jkl jkl jkl
类似cin.getline()里面的一个例子,gets()同样可以用在多维数组里面:
#include&iostream&
#include&string&
char m[3][20];
for(int i=0;i&3;i++)
cout&&"\n请输入第"&&i+1&&"个字符串:"&&
gets(m[i]);
for(int j=0;j&3;j++)
cout&&"输出m["&&j&&"]的值:"&&m[j]&&
请输入第1个字符串:
请输入第2个字符串:
请输入第3个字符串:
输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3
自我感觉gets()和cin.getline()的用法很类似,只不过cin.getline()多一个参数罢了;
这里顺带说明一下,对于本文中的这个kskr1,kskr2,kskr3的例子,对于cin&&也可以适用,原因是这里输入的没有空格,如果输入了空格,比如“ks kr jkl[回车]”那么cin就会已经接收到3个字符串,“ks,kr,jkl”;再如“kskr 1[回车]kskr 2[回车]”,那么则接收“kskr,1,kskr”;这不是我们所要的结果!而cin.getline()和gets()因为可以接收空格,所以不会产生这个错误;
6、getchar()
//接受一个字符,需包含“#include&string&”
#include&iostream&
#include&string&
ch=getchar();
//不能写成getchar(ch);
cout&&ch&&
输入:jkljkljkl
//getchar()是C语言的函数,C++也可以兼容,但是尽量不用或少用;
C++中各种输入读取函数
c++中cin等输入函数的用法
C++输入cin,cin.get(),cin.getline()详细比较及例子
字符串输入方式总结(cin cin.get()cin.getline() getline())
C++输入与输出—cout和cin的用法
c++输入的几种方式
c++输入的两种方式
C/C++中输入多组数据方法
C++输入和输出
C++输入一行字符串
没有更多推荐了,c++,cin&#47;cout 如何输入输出字符串数组_百度知道
c++,cin&#47;cout 如何输入输出字符串数组
#include &iostream&int main(){ char name[20]; cout&&&name:&; cin&&name[20]; cout&&name[20]&&}
cin&&name[20]; 这样输入有问题吗?似乎输入的时候只输出第一个字母...比如我输入abcd,他只输出a....怎么修改呢
&#xe6b9;答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
  C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C++通过流进行输入输出的过程。  cout语句的一般格式为:  cout&&表达式1&&表达式2&&……&&表达式n;  cin语句的一般格式为:  cin&&变量1&&变量2&&……&&变量n;
网络工程师
char name[20]中的“20”指的是数组大小,而数组是从下标为0开始的,name[20]明显不属于数组name,越界了。
你输入的值是赋给name[20],前面的19项都为赋值,你的输出也只是输出name[20]一个字符。修改如下:#include &iostream&int main(){char name[20];cout&&&name:&;cin&&cout&&name &&}
cin && name就行cin && name[20],name[n]是name数组里下标为n的元素,所以实际的效果只是输入了name[n]一个字符另外在这里你对name[20]的引用已经越界而且cin&&到一个char数组里也是极不安全的这种情况一般是使用cin.get( name, 20 )的形式,指定数组的长度以防止输入越界更好且更安全的做法是使用string#include &string&cin &&
cin&&name[20];你这样写意思是在给name[20]这个元素赋值但是name最大的下标是19显然越界了如果要用字符串数组赋值可以直接这样cin&&cout&&不过要注意数组大小够不够的问题哦
cin&&namecout&&name这样就可以了
其他4条回答
为您推荐:
其他类似问题
您可能关注的内容
字符串数组的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C++中cin的详细用法
cin是C++语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。
在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键( )会被转换为一个换行符 ,这个换行符 也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键( )将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。
cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。
2. cin的常用读取方法
使用cin从标准输入读取数据时,通常用到的方法有cin&&,cin.get,cin.getline。
2.1cin&&的用法
cin可以连续从键盘读取想要的数据,以空格、tab或换行作为分隔符。实例程序如下。
int main()
cin&&a&&b&&c;
cout&<a<</a<
在屏幕中一次输入:a[回车]11[回车]5.56[回车],程序将输出如下结果:
(1)cin&&等价于cin.operator&&(),即调用成员函数operator&&()进行读取数据。
(2)当cin&&从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin&&会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin&&不做处理。
(3)不想略过空白字符,那就使用 noskipws 流控制。比如cin&&noskipws&&
验证程序见如下:
int main()
cin&&a&&b&&c&&
cout&<a<</a<
从键盘输入:[回车][回车][回车]a[回车]5[回车]2.33[回车]hello[回车],输出结果是:
vcD4NCjxwPjxjb2RlIGNsYXNzPQ=="hljs" cpp="">从结果可以看出,cin&&对缓冲区中的第一个换行符视而不见,采取的措施是忽略清除,继续阻塞等待缓冲区有效数据的到来。但是,getline()读取数据时,并非像cin&&那样忽略第一个换行符,getline()发现cin的缓冲区中有一个残留的换行符,不阻塞请求键盘输入,直接读取,送入目标字符串后,再将换行符替换为空字符&&,因此程序中的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 )。
其中streamsize 在VC++中被定义为long long型。另外,还有两个重载形式不怎么使用,就不详述了,函数原型如下:
istream& get ( streambuf& sb);
istream& get ( streambuf& sb, char delim );
2.2.1 cin.get读取一个字符
读取一个字符,可以使用cin.get或者cin.get(var),示例代码如下:
int main()
a=cin.get();
cin.get(b);
cout&<a<<b<</a<<b<
输入:e[回车],输出:
(1)从结果可以看出,cin.get()从输入缓冲区读取单个字符时不忽略分隔符,直接将其读取,就出现了如上情况,将换行符读入变量b,输出时打印两次。
(2)cin.get()的返回值是int类型,成功:读取字符的ASCII码值,遇到文件结束符时,返回EOF,即-1。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表示目标空间的大小。示例代码如下:
int main()
char array[20]={NULL};
cin.get(array,20);
cin.get(a);
cout&<array<</array<
输入:[回车],输出:
(1)从结果可以看出,cin.get(array,20);读取一行时,遇到换行符时结束读取,但是不对换行符进行处理,换行符仍然残留在输入缓冲区。第二次由cin.get()将换行符读入变量b,打印输入换行符的ASCII码值为10。这也是cin.get()读取一行与使用getline读取一行的区别所在。getline读取一行字符时,默认遇到& &时终止,并且将& &直接从输入缓冲区中删除掉,不会影响下面的输入处理。
(2)cin.get(str,size);读取一行时,只能将字符串读入C风格的字符串中,即char*,但是C++的getline函数可以将字符串读入C++风格的字符串中,即string类型。鉴于getline较cin.get()的这两种优点,建议使用getline进行行的读取。关于getline的用法,下文将进行详述。
2.2.3 cin.getline读取一行
函数作用:从标准输入设备键盘读取一串字符串,并以指定的结束符结束。
函数原型有两个:
istream& getline(char* s, streamsize count); //默认以换行符结束
istream& getline(char* s, streamsize count, char delim);
使用示例:
int main()
char array[20]={NULL};
cin.getline(array,20); //或者指定结束符,使用下面一行
//cin.getline(array,20,&#39;
cout&<array<</array<
注意,cin.getline与cin.get的区别是,cin.getline不会将结束符或者换行符残留在输入缓冲区中。
3. cin的条件状态
使用cin读取键盘输入时,难免发生错误,一旦出错,cin将设置条件状态(condition state)。条件状态标识符号为:
goodbit:无错误
eofbi:已到达文件尾
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条件状态标志位,将流s中对应的条件状态位复位,返回void。
s.setstate(flags):根据给定的flags条件状态标志位,将流s中对应的条件状态位置位,返回void。
s.rdstate():返回流s的当前条件状态,返回值类型为strm::iostate。strm::iostate 机器相关的整形名,由各个iostream类定义,用于定义条件状态。
了解以上关于输入流的条件状态与相关操作函数,下面看一个因输入缓冲区未读取完造成的条件状态位failbit被置位,再通过clear()复位的例子。
int main()
char ch, str[20];
cin.getline(str, 5);
cout&<flag1:<<cin.good()<&
cout&<str:<<str<</str:<<str<</flag1:<<cin.good()<
输入:12345[回车],输出结果为:
可以看出,因输入缓冲区未读取完造成输入异常,通过clear()可以清除输入流对象cin的异常状态。,不影响后面的cin&&ch从输入缓冲区读取数据。因为cin.getline读取之后,输入缓冲区中残留的字符串是:5[换行],所以cin&&ch将5读取并存入ch,打印输入并输出5。
如果将clear()注释,cin&&将读取失败,ch为空。
4. cin清空输入缓冲区
从上文中可以看出,上一次的输入操作很有可能是输入缓冲区中残留数据,影响下一次的输入。那么如何解决这个问题呢?自然而然,我们想到了在进行输入时,对输入缓冲区进行清空和状态条件的复位。条件状态的复位使用clear(),清空输入缓冲区应该使用:
函数原型:istream &ignore( streamsize num=1, int delim=EOF );
函数作用:跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。
使用示例如下:
int main()
char str1[20]={NULL},str2[20]={NULL};
cin.getline(str1,5);
cin.clear();
// 清除错误标志
cin.ignore(numeric_limits::max(),&#39;
&#39;); //清除缓冲区的当前行
cin.getline(str2,20);
cout&<str1:<<str1<</str1:<<str1<
程序输入:12345[回车]success[回车],程序输出:
(1)程序中使用cin.ignore清空了输入缓冲区的当前行,使上次的输入残留下的数据没有影响到下一次的输入,这就是ignore()函数的主要作用。其中,numeric_limits::max()不过是头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。
如果想清空输入缓冲区,去掉换行符,使用:
cin.ignore(numeric_limits& std::streamsize&::max()); 清除cin里所有内容。
(2)cin.ignore();当输入缓冲区没有数据时,也会阻塞等待数据的到来。
(3)有个疑问,网上很多资料说调用cin.sync()即可清空输入缓冲区,本人测试了一下,VC++可以,但是在下使用GNU C++却不行,无奈之下,linux下就选择了cin.ignore()。
5.其它从标准输入读取一行字符串的方法
5.1 getline读取一行
C++中定义了一个在std名字空间的全局函数getline,因为这个getline函数的参数使用了string字符串,所以声明在了& string&头文件中了。
getline利用cin可以从标准输入设备键盘读取一行,当遇到如下三种情况会结束读操作:1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。
函数原型有两个重载形式:
istream& getline ( istream& is, string& str);//默认以换行符结束
istream& getline ( istream& is, string& str, char delim);
使用示例:
int main()
getline(cin,str);
cout&<str<</str<
输入:hello world[回车],输出:
注意,getline遇到结束符时,会将结束符一并读入指定的string中,再将结束符替换为空字符。因此,进行从键盘读取一行字符时,建议使用getline,较为安全。但是,最好还是要进行标准输入的安全检查,提高程序容错能力。
cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。
5.2 gets读取一行
gets是C中的库函数,在& stdio.h&申明,从标准输入设备读字符串,可以无限读取,不会判断上限,以回车结束或者EOF时停止读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
函数原型:char *gets( char *buffer );
使用示例:
int main()
char array[20]={NULL};
gets(array);
cout&<array<</array<
输入:I am lvlv[回车],输出:
由于该函数是C的库函数,所以不建议使用,既然是C++程序,就尽量使用C++的库函数吧。

我要回帖

更多关于 cin读取字符串 的文章

 

随机推荐