cin 输入方法详解:
【前导】
cin 输入操作原理: 输入操作的原理与之前提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。
[1]cin>>该操作符是根据后面变量的类型读取数据。输入结束条件:遇到Enter、Space、Tab键(这个很重要!) 。对结束符的处理 :丢弃缓存
[2]cin.get()该函数有三种格式:无参,一参数,二参数即cin.get(),cin.get(char ch), cin.get(array_name, Arsize) 。输入结束条件:Enter 键,对结束符处理:不丢弃
[3]cin.get(array_name, Arsize)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。
【cin>> / cin.get 用法】
因为cin>>会忽略掉所有前导白色空格,所以使用 cin>> 就不可能仅输入一个空格或回车符。除非用户输入了空格键、制表符之外的其他字符,否则程序将不可能通过 cin 语句继续执行(一旦输入了这样的字符,在程序可以继续下一个语句之前,仍然需要按回车键)。因此,要求用户“按回车键继续”的程序,不能使用 >> 运算符只读取按回车键的行为。
在这些情况下,cin 对象有一个名为 get 的内置函数很有帮助。因为 get 函数是内置在 cin 对象中的,所以可称之为 cin 的一个成员函数。get 成员函数读取单个字符,包括任何白色空格字符。
① 如果程序需要存储正在读取的字符,则可以通过以下任意一种方式调用 get 成员函数。
在这两个例子中,假设 cin 是正被读入字符的 char 变量的名称:
cin.get (ch);
ch = cin.get();
②如果程序正在使用 get 函数简单地暂停屏幕直到按回车键,并且不需要存储字符,则该函数也可以这样调用:
cin.get();
下面的程序演示了使用 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 所示:
当第 4 行中的 cin>> 语句读取用户输入的数据时,它会在遇到换行符时停止。换行字符未被读取,而是仍保留在键盘缓冲区中。从键盘读取数据的输入语句只在键盘缓冲区为空时等待用户输入值,但现在不为空。
当第 6 行中的 cin.get 函数执行时,它开始从先前输入操作停止的键盘缓冲区读取,并发现了换行符,所以它无须等待用户输入另一个值。这种问题最直接的解决办法是使用 cin.ignore 函数。
Nnboylhj: 博主打扰了,我看相关的例程是英文的,想问下是否有对应的资料出处呢?
m0_49278166: 完美的文章,没有一句废话,实用
忽然之间1204: 在汤小丹版《计算机操作系统(慕课版)》第65页中写道“每个线程都可以访问它们所属进程地址空间中的所有地址,一个线程的堆栈可以被其他线程读/写,甚至完全清除。”这也是我没弄明白的,每个线程都有自己的栈,和栈指针,那么这句可以互读互写是什么意思?是一种非法操作?还是一种编程技巧?
JZxixi: 原来我的错误也是虚析构函数没实现
XNB's Not a Beginner: 总结的很好