缓冲区:当输入一个串时,如果意外停止。则遇到第二次请求输入操作时,程序将不理会输入操作而直接从缓冲区读入字。
一、cin
头文件(iostream)。输入字符时遇到空字符(空格,回车,tab制表符)自动停止。所以不可用于输入带有空格的字符串。
- 输入流不会保留空字符,只是遇到后自动结束输入。
二、cin.get(字符数组名,长度,结束符号)
头文件 (iostream)。结束符号默认为ENTER(回车)。
①:接受一个字符时候: char ch; ch=cin.get()或者cin.get(ch); 遇到结束符时,在缓冲区中存储并不会丢弃。注意:当连续使用2次该语句时,若输入一个字符回车。输出为“那个字符”,“回车”。所以可以利用此性质,在多个未知个数字符串的录入操作中,跳出循环。下例:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a[80];
char c;
int i;
for (i=0;i<80;i++)
{
cin>>a[i];
c=cin.get();
if (c=='\n')break;
}
for (int j=i;j>=1;j--)
cout<<a[j]<<" ";
cout<<a[0];
return 0;
}
这是逆序输出字符串的代码。
②:接受字符数组—— cin.get(数组名,数组长度,结束符)。仅能读取(长度-1)个字符,最后一个是结束符。
同理,任然符合缓冲区的性质。
#include<iostream>
using namespace std;
int main()
{
char c[10];
cin.get(c,6);//除回车外只能存入5个字符,默认enter回车为结束符。
cout<<c<<endl;
char a;
cin.get(a);
cout<<a;
return 0;
}
输入:zifuchuan 回车
输出:zifuc
h //验证了仅能读取(长度-1)个字符,而且后续字符huan被存入缓冲区。
输入:zif回车
输出:zif
回车//验证仅输出结束符之前的串,且结束符自身任然在缓冲区内。
若将cin.get(c,6);变为cin.get(c, 6,‘m’);
输入:zifmzif回车
输出:zif
m//同理。
三、cin.getline(字符数组名,长度,结束符号)
与cin.get()不同,它不会保留结束符在缓冲区中,而是丢弃。
四、getline(cin, string类型名字,结束符号)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
getline(cin, str, 'a');
cout<<str;
return 0;
}
输入:string string回车
string stringa回车
输出: string string
string string
这是string类专属的输入方法,不用指定长度,自动变换。遇到回车默认结束。(getline)函数会抛弃结束符。
五、gets(), puts(), getc(), putc()
这些都是C语言的输入输出函数,需要加入2个头文件(stdio.h)和(string.h)。此外,puts()函数输出是自动输出一个回车换行。
综上所述,五种输入输出函数中只有cin遇到空字符自动结束,其余均对空字符有很大的宽容性。只有cin.get保留结束符,其余均抛弃结束符号。