您的位置:首页 > 编程语言 > C语言/C++

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

2012-06-23 19:05 281 查看


[语法]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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: