程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。
接下来以下列表格进行说明。
输入缓存区 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
存储的内存 |
一、 cin
输入结束条件 :ENTER、SPACE、TAB,然而未捕获到数据时会自动过滤掉这3个字符并从缓冲区删除。简单的理解,cin只能捕获英文单词
#include<iostream>
using namespace std;
void main()
{
char a[10],b[10];
char c[10]
cin>>a;
cin>>b;
cin.getline(c,10);
cout<<a;
cout<<b;
}
输入:SPACE ENTER
LiTAB
SiSPACE TAB ENTER
输出:LiSi
输入后字符内容在输入缓存区如下所示:
内存地址 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
输入缓存区 | SPACE | ENTER | L | i | TAB | S | i | SPACE | TAB | ENTER |
然而cin未捕获到数据时自动过滤掉并删除不可见字符:
内存地址 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
输入缓存区 | L | i | TAB | S | i | SPACE | TAB | ENTER |
首先捕获Li
赋值给a,然后滤过并删除TAB捕获Si
赋值给b。
内存地址 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
输入缓存区 | SPACE | TAB | ENTER |
从内存变量的值来看,cin赋值给b后,删除了ENTER(10),此时输入缓存区的情况为:
内存地址 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
输入缓存区 | SPACE | TAB |
二、cin.get(数组名,长度,结束符)
用来接收一行字符串,可以接收空格。
读入的字符个数最多为(长度-1)个,结束符规定结束字符串读取的字符,默认为ENTER。当满足最大字符数或遇见结束符时,结束捕获。
对结束符处理:不丢弃缓冲区中的ENTER
#include<iostream>
using namespace std;
void main()
{
char a[10],b[10];
cin.get(a,10); //A
// cin.get(); //C
cin.get(b,10); //B
cout<<a;
cout<<b;
}
输入:12SPACE
12ENTER
输出:12SPACE
12
连续使用时,A行捕获了12SPACE
12,然而输入缓存区的ENTER未被释放,被B行直接捕获赋值给b,注意此时b[0]是NULL,而不是13(CR),如下图:
若要读取单个字符,直接cin.get(char ch)
或char ch=cin.get()
(长度此时缺省)。也可用来解决上述问题,如C行代码所示。
- C++中一个汉字占两个字符
- 回车符(ENTER、CR) ASCII:13
- 换行符(LF) ASCII:10
三、cin.getline(数组名,长度,结束符)
cin.getline()和cin.get()函数用法一致,但其会:丢弃缓冲区中的ENTER
二中的程序可以用cin.getline()解决。
#include<iostream>
using namespace std;
void main()
{
char a[10],b[10];
cin.getline(a,10);
cin.getline(b,10);
cout<<a;
cout<<b;
}
关于cin.get()和cin.getline()函数的详细不同,请参考:
http://blog.csdn.net/xuexiacm/article/details/8101859
相关文章:
http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html
http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html