cin.get作用:从标准输入吸收任何字符(包括回车和空格),优先吸收cin缓存(之前cin的残留内容)。

#include <iostream>
#include <sstream>
#include <fstream>
using namespace std;
int main()
{char ch;ch =   cin.get();//从标准输入接受一个字符while(ch != ' ')        //只要这个字符不是' '空格即可{                        cout << ch << endl;   //ch不会放过任何字符,包括回车,但是输出一次,必须是回车后ch = cin.get();}cout << ch;                 //按键回车执行一次return 0;
}

与字符串输入一样,有时候使用 cin>> 读取字符也不会按我们想要的结果行事。

当用cin>>读取数据时候,最后的换行符会残留在cin缓存中。

例如,因为它会忽略掉所有前导白色空格,所以使用 cin>> 就不可能仅输入一个空格或回车符。除非用户输入了空格键、制表符之外的其他字符,否则程序将不可能通过 cin 语句继续执行(一旦输入了这样的字符,在程序可以继续下一个语句之前,仍然需要按回车键)。因此,要求用户“按回车键继续”的程序,不能使用 >> 运算符只读取按回车键的行为。

在这些情况下,cin 对象有一个名为 get 的内置函数很有帮助。因为 get 函数是内置在 cin 对象中的,所以可称之为 cin 的一个成员函数。get 成员函数读取单个字符,包括任何白色空格字符。如果程序需要存储正在读取的字符,则可以通过以下任意一种方式调用 get 成员函数。

在这两个例子中,假设 cin 是正被读入字符的 char 变量的名称:

cin.get (ch);
ch = cin.get();

如果程序正在使用 get 函数简单地暂停屏幕直到按回车键,并且不需要存储字符,则该函数也可以这样调用:

cin.get();

请注意,在所有这 3 个编程语句中,get 函数调用的格式实际上是一样的。首先是对象的名称,在此示例中它是 cin。然后是一个句点,其后是被调用的成员函数的名称,在这里当然就是 get。语句的末尾是一组括号和一个表示结束的分号。这是调用任何成员函数的基本格式,如图 1 所示。


图 1 成员函数调用的基本格式

下面的程序演示了使用 get 成员函数的所有 3 种方式:

 
  1. // This program demonstrates three ways to use cin.get()
  2. // to pause a program.
  3. #include <iostream>
  4. using namespace std;
  5. int main()
  6. {
  7. char ch;
  8. cout << "This program has paused. Press Enter to continue.";
  9. cin.get(ch);
  10. cout << "It has paused a second time. Please press Enter again."; ch = cin.get();
  11. cout << "It has paused a third time. Please press Enter again.";
  12. cin.get();
  13. cout << "Thank you! \n";
  14. return 0;
  15. }

程序输出结果:

This program has paused. Press Enter to continue.
It has paused a second time. Please press Enter again.
It has paused a third time. Please press Enter again.
Thank you!

注意,在 IDE 中运行程序时,当程序终止,则输出窗口会关闭,而 cin.get 函数可用于保持输出屏幕可见。

混合使用 cin>> 和 cin.get

将 cin >> 与 cin.get 混合使用可能会导致烦人且难以发现的问题。请看下面的代码段示例:

char ch;    //定义一个字符变量
int number; //定义一个整型变量
cout << "Enter a number: ”;
cin >> number;   // 读取整数
cout << "Enter a character: ";
ch = cin.get() ;   // 读取字符
cout << "Thank You!\n";

这些语句允许用户输入一个数字,而不是一个字符。看来第 6 行的 cin.get 语句已经被跳过了。这是因为 cin>> 和 cin.get 使用略有不同的技术来读取数据。

在示例代码段中,当执行第 4 行时,用户输入一个数字,然后按回车键。假设输入的是数字 100。按回车键会导致一个换行符('\n')存储在键盘缓冲区数字 100 之后,如图 2 所示。


图 2 键盘缓冲区存储和读取示意图

当第 4 行中的 cin>> 语句读取用户输入的数据时,它会在遇到换行符时停止。换行字符未被读取,而是仍保留在键盘缓冲区中。从键盘读取数据的输入语句只在键盘缓冲区为空时等待用户输入值,但现在不为空。

当第 6 行中的 cin.get 函数执行时,它开始从先前输入操作停止的键盘缓冲区读取,并发现了换行符,所以它无须等待用户输入另一个值。这种问题最直接的解决办法是使用 cin.ignore 函数。

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{char ch;int number;cout << "Enter a number: ";cin >> number;cout << "Enter a character: ";ch = cin.get();while((ch=cin.get()) != '\n')continue;                        //这个程序会不断从cin缓存中读取字符放入ch中,直到遇到回车'\n',所以最后ch还是回车符cout << "Thank you!\n";cout <<"print the  ch:" << ch;if(ch == '\n')cout << "ch == '\n'";return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main()
{char ch;ch = cin.get();cout << ch << endl;while(cin.get() != '\n')  //cin.get()会从缓存提取一个字符,如果有用则用,不用则丢弃cout << (char)(cin.get());return 0;
}

关于C++中cin()和cin.get()的用法,问题如下

char a[20];
int x;
cout<<"输入x";
cin>>x;
cout<<"输入字符数组:"
cin.get();
gets(a);
为什么要加cin.get()????

优质回答:

get()是对象cin的一个成2113员函数, 用于吸收5261字符, 这里可以吸收掉回车。4102 否则回车也会被存储到字符数1653组a里面。 这就相当于C程序中的getchar(), 懂了吗?

这里用一个getchar()和cin.get()效果一样, 不信你可以试一下。。

追问

我看到百度上有说cin>>x;的cin函数是丢弃回车的,也就是输入x之后并没有在输入流保存回车,那为什么还要用get()吸收回车?

追答

是的, 但是如果先回车, 想要再输入字符串的话, 程序就终止了对吧。。 你没有理解gets的用法, 如果遇到回车, gets就起不到应有的作用了。。你可以把a输出, 自己试一下有什么区别。。。 这段代码应该是某本书上的对吧, 作为一段程序,
健壮性是非常重要的。。

c++ 中的 cin.get()函数相关推荐

  1. C中不安全的函数以解决办法汇总

    C中不安全的函数以解决办法汇总 C 中大多数缓冲区溢出问题可以直接追溯到标准 C 库.最有害的罪魁祸首是不进行自变量检查的.有问题的字符串操作(strcpy.strcat.sprintf 和 gets ...

  2. cin.ignore()函数的使用

    ignore函数 功能:函数用于输入流.它读入字符,直到已经读了num 个字符(默认为1)或是直到字符delim 被读入(默认为EOF).   其调用形式为cin.ignore(n,终止字符) 原型: ...

  3. 如何在C ++中实现内联函数?

    Hey, folks! In this article, we will be unveiling a very powerful function offered by Inline functio ...

  4. 在C++ 中的清屏函数是什么?

    clrscr() 属于 cnoio.h  ,但是在c++ 中用不了. 想请教各位 c++ 中的清屏函数是什么? system("clr")//#include <proces ...

  5. C/C++中的str系列函数大全

    目录 1.strlen函数 2.strcpy函数 3.strcat函数 4.strncat函数 5.strcmp函数 6.strimp函数 7.strncmp函数 拓展: (1)strnicmp函数 ...

  6. R中设置图形参数--函数par()…

    原文地址:R中设置图形参数--函数par()详解作者:菜鸟的成长 R有着非常强大的绘图功能,我们可以利用简单的几行代码绘制出各种图形来,但是有时候默认的图形设置没法满足我们的需要,甚至会碰到各种各样的 ...

  7. LabVIEW中使用CIN节点

    source: click here CIN(Code Interface Node)节点是LabVIEW中用来调用C/C++代码的功能节点.它与动态链接库的不同之处在于,它能够将代码集成在VI中作为 ...

  8. C++中的结构体函数(一)

      本文建议在看完"C++中的数组函数"后食用.   结构体在某种程度上与数组有一定的相似性,就是能够包含较多的元素.不过结构体与数组相比起来,其整体性更强.整体性强的表现主要体现 ...

  9. 习题 8.5 将本章的例8.4改写为一个多文件的程序:1.将类定义放在头文件arraymax.h中;2.将成员函数定义放在源文件arraymax.cpp中;3.主函数放在源文件file1.cpp中。

    C++程序设计(第三版) 谭浩强 习题8.5 个人设计 习题 8.5 将本章的例8.4改写为一个多文件的程序: 1.将类定义放在头文件arraymax.h中: 2.将成员函数定义放在源文件arraym ...

最新文章

  1. 设备树的具体使用方法
  2. 计算机视觉形态学之膨胀、腐蚀、开运算、闭运算、顶帽、黑帽和形态学梯度
  3. mac安装mysql mysql命令找不到_MacBook通过Homebrew安装mysql
  4. 定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
  5. Day12-date time
  6. 清华大学 lt;现代软件工程gt; 项目小组名单
  7. OpenShift 4 之集群是如何通过Cluster Version Operator升级的?
  8. 厦门大学c语言第七八章作业答案,厦门大学 运筹学 第七、八章作业
  9. GAN的目标函数(F散度;KL散度;JS散度;Pearson \chi^2 散度;IPM;Wasserstein距离;MMD)
  10. laypage ajax,laypage.js分页插件使用方法详解
  11. pycharm 自定义区域折叠代码
  12. 2015InfoQ软件大会技术记录
  13. c语言中swipe的作用,浅谈在vue中使用mint-ui swipe遇到的问题
  14. 解决win10蓝牙搜索到小爱音箱无法连接问题
  15. Python与Java容器总结
  16. EuroSys'14 会议记录
  17. GitFlow 代码管理模型实战
  18. eai java_关于EAI,ETL与EII
  19. SAP与金蝶星瀚:ERP销售业务实现技术方式区别
  20. label的自动换行

热门文章

  1. LruCache:从网络加载图片缓存实例
  2. 配置Windows下编译运行C/C++过程
  3. iOS开发常用的第三方
  4. powerdesigner导出sql时自动生成注释
  5. 设计模式之“适配器模式”
  6. 小波图像分解与重构程序存在的问题与解决办法
  7. RxSwift之深入解析dispose源码的实现原理
  8. 2013\National _C_C++_A\5.网络寻路
  9. 拓展阅读 —— G6 坐标系深度解析
  10. 彻底掌握动态规划,第一节