头文件 #include <iostream>
程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入
cin.get()当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。
当输入数据的长度不固定时,即以输入结束符结束时:
abcd...balabla+enter Ctrl + Z enter此时要获取缓冲区中的字符或者数组可以通过以下方式:
char ch; ch = cin.get();示例:
#include <iostream> #include<algorithm> #include <vector> using namespace std; void getin(vector<int> &vec){ int val = 0; char ch; bool flag = 0, minus = 0; //flag用来标注最后一个val是否输入到vec中,minus判断是否为负 while(ch = cin.get()){ if(ch == '\n') //如果是换行符,结束 break; if(ch == ' '){ //如果是空格,将空格前的数插入到vec中,开始记录新的数 vec.push_back(val); val = 0; flag = 1; minus = false; continue; } if(ch == '-'){ minus = true; continue; } flag = 0; if(minus == true){ val = val*10-(ch-'0'); }else{ val = val*10+ch-'0'; } } if(flag == 0) vec.push_back(val); } int main(){ vector<int> vec; getin(vec); for(int i = 0; i < vec.size(); i++){ cout << vec[i] << " "; } cout << endl; return 0; }需要注意的是: 如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。
举例: 输出双精度数。
double a=123.456789012345; //对a赋初值 (1) cout<<a; //输出: 123.456 (2) cout<<setprecision(9)<<a; //输出: 123.456789 (3) cout<<setprecision(6); //恢复默认格式(精度为6) (4) cout<< setiosflags(ios∷fixed); //输出: 123.456789 (5) cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a; //输出: 123.45678901 (6) cout<<setiosflags(ios∷scientific)<<a; //输出: 1.234568e+02 (7) cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a; //输出: 1.2346e02下面是整数输出的例子:
int b=123456; //对b赋初值 (1) cout<<b; //输出: 123456 (2) cout<<hex<<b; //输出: 1e240 (3) cout<<setiosflags(ios∷uppercase)<<b; //输出: 1E240 (4) cout<<setw(10)<<b<<','<<b; //输出: 123456,123456 (5) cout<<setfill('*')<<setw(10)<<b //输出: **** 123456 (6) cout<<setiosflags(ios∷showpos)<<b; //输出: +123456如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。
例3.1 各行小数点对齐。
#include <iostream> #include <iomanip> using namespace std; int main( ) { double a=123.456,b=3.14159,c=-3214.67; cout<<setiosflags(ios∷fixed)<<setiosflags(ios∷right)<<setprecision(2); cout<<setw(10)<<a<<endl; cout<<setw(10)<<b<<endl; cout<<setw(10)<<c<<endl; return 0; }输出如下: 123.46 (字段宽度为10,右对齐,取两位小数) 3.14 -3214.67 先统一设置定点形式输出、取两位小数、右对齐。这些设置对其后的输出均有效(除非重新设置),而setw只对其后一个输出项有效,因此必须在输出a,b,c之前都要写setw(10)。
