[语法]C++ 中cin 输入流的多种函数用法

cin、cin.get()、cin.getline()、getline()、gets()函数的用法

 

1、cin>>          

用法1:最基本,也是最常用的用法,输入一个数字:

#include <iostream>
using namespace std;
main ()
{
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
}

输入:2[回车]3[回车]
输出:5

用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束

#include <iostream>
using namespace std;
main ()
{
char a[20];
cin>>a;
cout<<a<<endl;
}

输入:jkljkljkl
输出:jkljkljkl

输入:jkljkl jkljkl       //遇空格结束
输出:jkljkl

2、cin.get()

 

用法1: cin.get(字符变量名)可以用来接收字符

#include <iostream>
using namespace std;
main ()
{
char ch;
ch=cin.get();               //或者cin.get(ch);
cout<<ch<<endl;
}

输入:jljkljkl
输出:j

用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格

#include <iostream>
using namespace std;
main ()
{
char a[20];
cin.get(a,20);
cout<<a<<endl;
}

输入:jkl jkl jkl
输出:jkl jkl jkl

输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd              (接收19个字符+1个'\0')

用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足.

这个我还不知道怎么用,知道的前辈请赐教;

3、cin.getline()   // 接受一个字符串,可以接收空格并输出

#include <iostream>
using namespace std;
main ()
{
char m[20];
cin.getline(m,5);
cout<<m<<endl;
}

输入: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>
using namespace std;

main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"\n请输入第"<<i+1<<"个字符串:"<<endl;
cin.getline(m[i],20);
}

cout<<endl;
for(int j=0;j<3;j++)
cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;

}

请输入第1个字符串:
kskr1

请输入第2个字符串:
kskr2

请输入第3个字符串:
kskr3

输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3

4、getline()     // 接受一个字符串,可以接收空格并输出,需包含“#include<string>”

#include <iostream>
#include <string>
using namespace std;
void main(void)
{
string st ;
cout<<"Input st:";
getline(cin,st);
cout<<st<<endl;
}

上面这段代码,如果输入abc,那么需要按两次回车键才能显示abc(在VC6中),因为getline有三个参数,第三个参数是字符串的结束符,也就是当getline遇到这个结束符时,就不在接受输入了,比如写成 getline(cin,st,'s'); 即使输入的是abcsabc 那么也只会显示 abc ,因此对于上面出现的情况,有人说getline默认情况下以回车('\n')作为结束符,第一次按回车表示字符串结束,第二次按回车才开始输出。

5、gets()        // 接受一个字符串,可以接收空格并输出,需包含“#include<string>”

#include<iostream>
#include<string>
using namespace std;
main ()
{
char m[20];
gets(m);                       //不能写成m=gets();
cout<<m<<endl;
}

输入:jkljkljkl
输出:jkljkljkl

输入:jkl jkl jkl
输出:jkl jkl jkl

类似cin.getline()里面的一个例子,gets()同样可以用在多维数组里面:

#include<iostream>
#include<string>
using namespace std;

main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"\n请输入第"<<i+1<<"个字符串:"<<endl;
gets(m[i]);
}

cout<<endl;
for(int j=0;j<3;j++)
cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;

}

请输入第1个字符串:
kskr1

请输入第2个字符串:
kskr2

请输入第3个字符串:
kskr3

输出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>
using namespace std;
main ()
{
char ch;
ch=getchar();                      
cout<<ch<<endl;
}

输入:jkljkljkl
输出:j

 

 

 

3、Cin.ignore()
        Cin.ignore()方法cin.ignore(5, 'c')的是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到5或者被抛弃的字符是'c',则cin.ignore()函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(1024, '\n');通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。
4、cin.sync()
        清空输入缓冲区的内容
        在输入规定的数目float型数据中错误输入一个string型,然而后提示输入错误,转重新输入,直到输入正确,可以执行下面的程序

int x;
cin >> x;
while (cin.fail())
{
  cin.clear();
  cin.sync();
  cout << "XXXXX"<<endl;
  cin >> x;
}



5、Cin.clear()
         Cin.clear()用法如果输入发生错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值,只要将ios::goodbit作为实参。

#include <iostream>
using namespace std;
void main()
{
    int a;
    cout<<"输入一个字母:"<<endl;
    cin>>a;                //int型变量中放了char型数据,failbit置1
    cout<<"cin.fail()="<<cin.fail()<<endl;            //输出1
    cout<<"输入一个数字:"<<endl;    //由于failbit值为1,输入流不能正常工作
    cin>>a;                        //故此处的输入无效
    cout<<a<<endl;                //输出不确定值
    cin.clear();                //此处用cin.clear()流标志复位    
    cout<<"cin.fail()="<<cin.fail()<<endl;        //此处failbit已为0
    cout<<"输入一个数字:"<<endl;
    //但刚才输入的字符并没有从流中清除,所以cin>>a又把那个字符放入a中,流输入流又不能正常工作
    cin>>a;
    cout<<a<<endl;    //输出不确定值
    cout<<"cin.fail()="<<cin.fail()<<endl;    //在此处failbit又为1
    cin.clear();            //再次修复输入流
    cin.ignore();            //取走刚才流中的字符
    cout<<"输入一个数字:"<<endl;    //再次接收用记输入,这次输入数字,正常输出了
    cin>>a;
    cout<<"a="<<a<<endl;
    //现在再看一下输入流的failbit
    cout<<"cin.fail()="<<cin.fail()<<endl;//输出0,表明输入流已恢复正常
}



6、cin.rdstate()
        这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。
                goodbit 无错误
                Eofbit 已到达文件尾
                failbit 非致命的输入/输出错误,可挽回
                badbit 致命的输入/输出错误,无法挽回
        有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数,它将返回当前状态的错误标记。例如,假如没有任何错误,则rdstate()会返回goodbit.
  下例示例,表示出了rdstate()的用法:

#include <iostream>  
using namespace std;  
int main()  
{  
    int a;  
    cin>>a;  
    cout<<cin.rdstate()<<endl;  
    if(cin.rdstate() == ios::goodbit)  
    {  
        cout<<"输入数据的类型正确,无错误!"<<endl;  
    }  
    if(cin.rdstate() == ios_base::failbit)  
    {  
        cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl;  
    }  
    system("pause");  
}


  另一种方法则是使用下面任何一个函数来检测相应的输入/输出状态:
                bool bad();
                bool eof();
                bool fail();
                bool good();


  下例示例,表示出了上面各成员函数的用法:

#include <iostream>  
using namespace std;  
int main()
{  
    int a;  
    cin>>a;  
    cout<<cin.rdstate()<<endl;  
    if(cin.good())  
    {  
        cout<<"输入数据的类型正确,无错误!"<<endl;  
    }  
    if(cin.fail())  
    {  
        cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl;  
    }  
    system("pause");  
}
 
 
 
 
cin.peek()  将下一字节作为int值返回但不移出它

我试了个例子

#include <iostream>
using namespace std;

int main(void)
{
char ch, temp;

while (cin.get(ch)){
  temp = cin.peek();
  cout.put(temp);
}
 
return 0;
}


假如输入abc
则输出bc

我想大概是:
先cin.get(ch)  把abc插入流中   当前流位置在a处
temp = cin.peek() 通过.peek() 把当前流的下一字符的副本  即为b返回给temp
所以输出b 
然后通过循环 流位置在b处   再通过.peek()返回流的下一字符c给temp
所以输出c

posted @ 2011-11-08 13:19  Tenger  阅读(3453)  评论(0编辑  收藏  举报