数据长度未知 c语言,C++输入获取未知长度的行输入数组 与 输出控制

头文件 #include

程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而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

#include

#include

using namespace std;

void getin(vector &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 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<

(2) cout<

(3) cout<

(4) cout<< setiosflags(ios∷fixed); //输出: 123.456789

(5) cout<

(6) cout<

(7) cout<

下面是整数输出的例子:

int b=123456; //对b赋初值

(1) cout<

(2) cout<

(3) cout<

(4) cout<

(5) cout<

(6) cout<

如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。

例3.1 各行小数点对齐。

#include

#include

using namespace std;

int main( )

{

double a=123.456,b=3.14159,c=-3214.67;

cout<

cout<

cout<

cout<

return 0;

}

输出如下: 123.46 (字段宽度为10,右对齐,取两位小数) 3.14 -3214.67 先统一设置定点形式输出、取两位小数、右对齐。这些设置对其后的输出均有效(除非重新设置),而setw只对其后一个输出项有效,因此必须在输出a,b,c之前都要写setw(10)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值