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

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

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

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

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

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

cin.get();

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

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

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

// This program demonstrates three ways to use cin.get()
// to pause a program.
#include <iostream>
using namespace std;int main()
{char ch;cout << "This program has paused. Press Enter to continue.";cin.get(ch);cout << "It has paused a second time. Please press Enter again.";ch = cin.get();cout << "It has paused a third time. Please press Enter again.";cin.get();cout << "Thank you! \n";return 0;
}

程序输出结果:

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 函数。

C++ cin.get用法(详解版)相关推荐

  1. c语言getline作用,C++ cin.getline及getline()用法详解

    下面先看下C++ cin.getline用法,具体内容如下所示: 使用 C++ 字符数组与使用 string 对象还有另一种不同的方式,就是在处理它们时必须使用不同的函数集.例如,要读取一行输入,必须 ...

  2. MultiByteToWideChar和WideCharToMultiByte用法详解

    //======================================================================== //TITLE: //    MultiByteT ...

  3. linux mount命令参数及用法详解

    linux mount命令参数及用法详解 非原创,主要来自 http://www.360doc.com/content/13/0608/14/12600778_291501907.shtml. htt ...

  4. Linux下的awk用法详解

    Linux下的awk用法详解 一.awk介绍 二.awk的语法 三.awk常见用法 四.awk其他用法 五.awk语言特性 一.awk介绍 1.AWK 是一种处理文本文件的语言,是一个强大的文本分析工 ...

  5. jQuery 表单验证插件,jQuery Validation Engine用法详解

    jQuery 表单验证插件,jQuery Validation Engine用法详解 功能强大的 jQuery 表单验证插件,适用于日常的 E-mail.电话号码.网址等验证及 Ajax 验证,除自身 ...

  6. java string()函数_转载java String.split()函数的用法详解

    转载java String.split()函数的用法详解 如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!在java.lang包中有String.split()方法的原型是: p ...

  7. string类的用法详解

    //string函数用法详解!附代码,写具体的用法! #include <iostream> #include <string> #include <sstream> ...

  8. python定义类object_Python之ClassObject用法详解

    类和对象的概念很难去用简明的文字描述清楚.从知乎上面的一个回答中可以尝试去理解: 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行 ...

  9. STL中map和string, vector 用法详解

    1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...

  10. C++/C--unordered_map常见用法详解

    文章目录 1. std::unordered_map 的定义与特性 2. 构造 std::unordered_map 3. 赋值操作 4. 迭代器操作 4.1 指向整个容器中的元素 4.2 指向某个桶 ...

最新文章

  1. 使用cxf开发webservice应用时抛出异常
  2. Mac电脑同步工程到github
  3. osqa java_从LSM-Tree、COLA-Tree谈到StackOverflow、OSQA(召唤前端)
  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第22篇]如何用蒙哥马利算法表示一个数字和多个相乘的数字
  5. 将二维列表输出到excel
  6. 2017-2018-1 20155313 《信息安全系统设计基础》第五周学习总结
  7. 直接插入排序_【真题讲解】15软专真题:直接插入排序
  8. 共享单车需求预测问题:分析篇
  9. 介绍Unity中相机的投影矩阵与剪切图像、投影概念
  10. wps无法打印_wps官方下载最新版_wps办公软件官方下载[办公软件]
  11. 近期看到AlphaGo算法最清晰的解读
  12. c语言自动变量全局变量,C语言全局变量的一些简单介绍
  13. python-类(class)是什么?怎么用?
  14. Simulink视频和图像处理模块介绍
  15. mysql innodb 缓冲池_mysql8 参考手册--配置多个InnoDB缓冲池实例
  16. 寒武纪“失速”,是AI芯片行业的阵痛?
  17. 离散信号的抽取和内插例题_抽取和内插
  18. 4.11每日一题之亲戚(洛谷c++)|简单并查集
  19. 线程状态,优先级,守护线程基础详解
  20. Windows同一局域网如何文件共享

热门文章

  1. Excel 分组后计算
  2. P3376 【模板】网络最大流【EK算法+Dinic算法解】
  3. 深度丨语音识别技术专利申请分析及关键技术展望(上)
  4. bluetoothctl No default controller available
  5. 微pe不识别nvme固态硬盘_WinPE无法识别NVMe SSD硬盘,如何重装系统
  6. 2023西安电子科技大学计算机考研信息汇总
  7. 如何解决安装PD17虚拟机 “操作失败 执行该操作失败”问题
  8. 计算机科学类期刊排名,计算机学术期刊排名:Computer Science Journal Ranki
  9. 文件的文件名翻译重命名技巧操作
  10. 洛谷3244 [HNOI2015]落忆枫音