说明:流输入运算符,在一定程度上为C++程序的开发提供了很多便利,我们可以避免C语言那种繁琐的输入格式,比如在输入一个数值时,还需指定其格式,而cin以及cout则不需要。但是cin也有一些缺陷,比如当输入字符串时,遇到空格便截止,举个例子,如下,我们在输入“12 23.5 aa bb cc dd”,希望打印出的是前两个数值以及后面一个字符串“aa bb cc dd”,但实际打印出来的只有前两个数字和“aa”。

 #include <iostream>
using namespace std;
int main()
{
int a;
double b;
string buf;
cin>>a>>b>>buf;
//读入字符串时遇到空格则止 12 23.5 aa bb cc dd cout<<a<<endl;
cout<<b<<endl;
cout<<buf<<endl;
return 0;
}

为了解决诸多如此类的问题,于是C++提供了cin不可或缺的成员函数。具体用法及区别一一列举如下。

1.char get() 读入一个字符并返回(包括回车;tab;空格等空白字符)

示例1:

 int main()
{
char ch; //EOF为文件结束符,在windows系统下,用ctrl+z输入EOF,在linux环境下为ctrl+d
while((ch = cin.get()) != EOF)
cout<<ch;
return 0;
}

注意:此程序在运行后,可以在键盘上任意输入,屏幕将显示输入的所有内容,当输入文件结束符时,退出程序。(所有示例应包含<iostream>头文件,并且使用命名空间std,此处略,详见说明部分程序。下同)

2.istream& get(char&) 读入一个字符,读取成功返回非0,读取失败(比如遇到文件结束符)返回0值

示例2:

 int main()
{
char ch; //get函数返回的是istream&,可实现链式编程
while(cin.get(ch))
cout.put(ch);
return 0;
}

3. istream& get(char *, int ,char )

istream& get(字符指针,字符个数 n,终止字符)
功能:从输入流中读取n-1字符,赋给字符数组或字符指针所指向的数组。如果在读取n-1个字符之前遇到终止字符,则提前结束。如果成功则返回非0,失败则返回0。会清空char*指向的空间,未读到n-1个字符或中止符,则会阻塞。不会越过中止符。在讲这个成员函数之前,先说几个简单的cin的其他成员函数,以便于更好地阐述这个函数:

a.istream& ignore(streamsize n = 1, int delim= EOF);

功能:从当前指针位置开始,忽略n个字节字符,直到遇到delim停止,默认参数为忽略一个字节

b.int peek()

功能:用来查看当前指针所在位置,用完当前指针位置不发生变化。

c.istream& putback (char c);

功能:往当前指针位置插入一个char c;

示例3:

查看代码

 int main()
{
char ch[20]; //键盘输入i like c/i like c++ also/
cin.get(ch,20,'/');
cout<<"the first part is:"<<ch<<endl<<endl; //查看当前指针所在位置
char peek = cin.peek();
cout<<"the peek is:"<<peek<<endl<<endl; //忽略'/'这个字符
cin.ignore(1,'/');
//往当前指针位置插入一个char
cin.putback('a'); peek = cin.peek();
cout<<"the peek is:"<<peek<<endl<<endl; cin.get(ch,20,'/');
peek = cin.peek();
cout<<"the second part is:"<<ch<<endl<<endl;
cout<<"the peek is:"<<peek<<endl<<endl;
return 0;
}

程序运行结果:

4.istream& getline(char *p, int n, char c)

cin.getline(字符数组或字符指针,字符个数 n,[终止字符])
功能:与带三个参数的get()功能类似,从输入流中读取n-1字符,赋给字符数组或字符指针所指向的空间。如果在读取n-1个字符之前遇到终止字符(如果不写,默认为’\n’),则提前结束。会清空char*指向的空间,未读到n-1个字符或中止符,则会阻塞,会越过中止符。
 
示例3:
 int main()
{
char str[1024];
     //此处输入同上,为i like c/i like c++ also/
//输入20个字符,遇到'/'截止,会越过终止符,不需手动忽略,
//如果不写终止符,默认为'\n'
     cin.getline(str,10,'/');
cout<<str<<endl;
cin.getline(str,10,'/');
cout<<str<<endl;
return 0;
}

程序运行结果:

需要注意的是:

get和getline最大的区别就是,get遇到界定符时,停止执行,但并不从流中提取界定符,再次调用会遇到同一个界定符,函数将立即返回,不会提取输入。getline则不同,它将从输入流中提取界定符,但伤然不会把它放到缓冲区中。简单来说就是前者不会自动忽略界定符,而后者会。

5.ostream put(char p)

功能:输出一个字符,返回值为ostream类型,可实现链式编程

示例:

 int main()
{
char str[] = "programming with with C++";
for(unsigned int i = 0;i <sizeof(str)/sizeof(str[0]);i++)
{
//输出一个字符,返回类型为ostream,以实现再次调用(如下)
cout.put(str[i]).put('x');
}
return 0;
}

程序运行结果:

(C/C++学习)3.C++中cin的成员函数(cin.get();cin.getine()……)的更多相关文章

  1. 在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static

    在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create ...

  2. C++笔记007:易犯错误模型——类中为什么需要成员函数

    先看源码,在VS2010环境下无法编译通过,在VS2013环境下可以编译通过,并且可以运行,只是运行结果并不是我们期待的结果. 最初通过MyCircle类定义对象c1时,为对象分配内存空间,r没有初始 ...

  3. map中的erase成员函数用法

    转载于 http://www.cnblogs.com/graphics/archive/2010/07/05/1771110.html  http://hi.baidu.com/sdkinger/it ...

  4. c++ 学习之const专题之const成员函数

    一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: ...

  5. C/C++中的常成员函数

    代码: #include <iostream> using namespace std; class A{ public: void func1(){ cout<<" ...

  6. C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解

    http://blog.csdn.net/gmstart/article/details/7046140 在C++的类定义里面,可以看到类似下面的定义: 01 class List { 02 priv ...

  7. C++ class 中的 const 成员函数

    const 修饰的成员函数  表示  不会修改class中的成员变量. const 和 非-const 的成员函数同事存在时, 用户定义 const 类对象,调用 const 成员函数: 定义 非-c ...

  8. Python学习之---Python中的内置函数(方法)(更新中。。。)

    add(item)   #将item添加到s中,如果item已经在s中,则无任何效果 break        #退出循环,不会再运行循环中余下的代码 bool()     #将参数转换为布尔型 by ...

  9. C++类中的特殊成员函数-------复制构造函数

    在C++中存在一个特殊函数,他就是复制构造函数,假如我们有类A,如果有A a;A b=a;   在这种情况下利用A类变量a来给同是A类变量的b来赋值,这个时候类会使用复制构造函数,如果我们不显式声明复 ...

随机推荐

  1. 【从0開始Tornado建站】发表文章和评论

            先上个效果图: 这是每一个用户的主页.由于是基本功能.所以用户头像.爱好等信息都还没有,在下一阶段加上.右側"发表新文章"按钮点击后进入发表文章的页面: 之前尝试过 ...

  2. 个人常常使用的一些Eclipse技巧

    引言 为了加快开发效率,方便地浏览源代码,重构以及重写一些方法等,Eclipse给我们提供了非常多方便的快捷键以及小技巧.以下是我总结一下经常使用的快捷键和技巧. 快捷键 清理控制台(console) ...

  3. oracle强化练习之单行函数

    1.      显示dname和loc中间用-分隔 Select dname ||'-'|| loc From dept; 2.      将部门名称左填充为10位 Select lpad( dnam ...

  4. 关注C-RAN 的五大理由

     关注C-RAN的五大理由 Scott Wakelin 近期行业媒体上有大量关于移动网络运营商(如美国的VerizonWireless和AT&T.法国电信以及中国移动等)怎样在着力探索一种 ...

  5. CentOS-6.5安装配置Tomcat-7

    https://my.oschina.net/u/593517/blog/304483 http://blog.csdn.net/lgh0824/article/details/51194116 摘要 ...

  6. Android系统Recovery工作原理之使用update.zip升级过程分析(八)---解析并执行升级脚本updater-script【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465551  Android系统Recovery工作原理之使用update.zip升级过程分 ...

  7. How to Integrate .NET Projects with Jenkins

    https://www.swtestacademy.com/jenkins-dotnet-integration/ 8) Unit Tests and Test Coverage Settings D ...

  8. 辨异 —— Java 中 String 的相等性比较

    How do I compare strings in Java? 1. 语法知识 ==:判断的是引用的相等性(reference equality),也即是否为同一对象: .equals():判断的 ...

  9. hdu1533 费用流模板

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  10. 【BZOJ 1598】 牛跑步

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1598 [算法] A*求k短路 [代码] #include<bits/stdc+ ...