C++输入获取未知长度的行输入数组 与 输出控制

xiaoxiao2021-02-28  91

头文件 #include <iostream>

程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入


cin的三种方式

cin >> n; //Enter、Space、Tab作为结束条件(会将其丢出缓冲区) ch = cin.get() | cin.get(ch) //Enter作为结束符(不丢弃缓冲区中的Enter,即下次输入的是enter) cin.getline(数组名,长度,结束符) 大体与 cin.get(数组名,长度,结束符)类似。

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)。


转载请注明原文地址: https://www.6miu.com/read-97046.html

最新回复(0)