网站优化助手,杭州网站建设 seo,大连鼎信网站建设公司地址,网站建设 引导C操纵符用来控制输出控制#xff0c;一是输出的形式#xff0c;二是控制补白的数量和位置。本文记录一下#xff0c;在一些笔试的ACM模式可能有用。其中1-4节的部分是关于格式化输入输出操作#xff0c;5-6节的部分是关于未格式化输入输出操作。
1. 控制布尔值的格式
一般…C操纵符用来控制输出控制一是输出的形式二是控制补白的数量和位置。本文记录一下在一些笔试的ACM模式可能有用。其中1-4节的部分是关于格式化输入输出操作5-6节的部分是关于未格式化输入输出操作。
1. 控制布尔值的格式
一般我们用cout打印bool值为1或0如果我们要打印为true或false那么我们可以对流使用boolalpha操作符
cout default bool values: true false \nalpha bool values: boolalpha true false endl;输出的结果是 default bool values: 1 0 alpha bool values: true false 操作符boolalpha会改变格式状态会影响下一个和随后的输出如果我们不想影响到后面的格式输出我们需要使用另一个操纵符noboolalpha改变格式。
cout default bool values: true false \nalpha bool values: boolalpha true false endl noboolalpha;2. 控制整型的进制
我们常常需要将整型的进制转换为十六进制、八进制或十进制
cout default: 20 1024 endl;
cout octal: oct 20 1024 endl;
cout hex: hex 20 1024 endl;
cout decimal: dec 20 1024 endl;输出的结果是 default: 20 1024 octal: 24 2000 hex: 14 400 decimal: 20 1024 如果我们要在输出中指出进制
前导0x表示十六进制前导0表示八进制无前导字符串表示十进制
我们可以使用showbase修改上面的程序
cout showbase;//打印整型值显示进制
cout default: 20 1024 endl;
cout octal: oct 20 1024 endl;
cout hex: hex 20 1024 endl;
cout decimal: dec 20 1024 endl;
cout noshowbase;//恢复流状态输出的结果 default: 20 1024 octal: 024 02000 hex: 0x14 0x400 decimal: 20 1024 如果要显示整型数为大写的十六进制我们可以使用uppercase
cout uppercase showbase hex // 打印整型值显示进制 printed in hexadecimal: 20 1024 endl;
cout nouppercase noshowbase dec endl; // 恢复流状态输出的结果 printed in hexadecimal: 0X14 0X400 3. 控制浮点数格式
浮点数的格式主要有三种控制格式
以多高精度多少个数字打印浮点值数值是打印为十六进制、定点十进制还是科学计数法形式对于没有小数部分的浮点值是否打印小数点
默认情况下
浮点值按六位数字精度打印如果浮点值没有小数部分则不打印小数点根据浮点数的值选择打印成定点十进制或科学记数法形式非常大或非常小的数打印为科学计数法其他值打印为定点十进制形式。
3.1 指定打印精度
可以式运算precision成员或使用setprecision操纵符来改变精度
precision成员是重载的。一个版本接受一个int值将精度设置为此值并返回旧精度值。另一个版本不接受参数返回当前的精度值。setprecision操纵符接受一个参数用来设置精度。
#include iostream
#include cmath
#include iomanip
using namespace std;
int main()
{cout Precision: cout.precision() , Value: sqrt(2.0) endl;cout.precision(12);cout Precision: cout.precision() , Value: sqrt(2.0) endl;cout setprecision(3);//要包含iomanip库cout Precision: cout.precision() , Value: sqrt(2.0) endl;
}输出的结果 Precision: 6, Value: 1.41421 Precision: 12, Value: 1.41421356237 Precision: 3, Value: 1.41 下表是定义在iostream里的其他操纵符。
3.2 指定浮点数的记数法
除非要控制浮点数的表示形式否则由标准库选择记数法是最好的方式。
我们可以强制一个流使用科学记数法、定点十进制或十六进制记数法。
操纵符scientific改变流的状态用科学记数法。操纵符fixed改变流的状态使用定点十进制。
新标准库里我们可以使用hexfloat强制浮点数使用十六进制格式另外还有一个defaultfloat的操纵符将流恢复到默认状态根据要打印的值选择记数法。
使用scientific、fixed或hexfloat精度控制的是小数点后面的数字位数而默认情况下精度值指定的是数字的总位数既包括小数点之后的数字也包括小数点之前的数字我们可以使用fixed或scientific按列打印数值因为小数点距小数部分的距离是固定的
cout default format: 100 * sqrt(2.0) \n scientific: scientific 100 * sqrt(2.0) \n fixed decimal: fixed 100 * sqrt(2.0) \n hexadecimal: hexfloat 100 * sqrt(2.0) \n use defaults: defaultfloat 100 * sqrt(2.0) \n\n;输出的结果 default format: 141.421 scientific: 1.414214e02 fixed decimal: 141.421356 hexadecimal: 0x8.d6bde009b35cp4 use defaults: 141.4212570 3.3 打印小数点
默认情况下当一个浮点数的小数部分为0时不显示小数点showpoint操纵符可以强制打印小数点
cout 10.0 endl;
cout showpoint 10.0 noshowpoint endl;输出的结果 10 10.0000 3.4 输出补白
当按列打印数据的时候我们常常需要非常精细地控制数据格式标准库提供了一些操纵符帮助我们完成所需的控制
setw指定下一个数字或字符串值的最小空间类似endl不改变输出流的内部状态它只决定下一个输出的大小。left表示左对齐输出right表示右对齐输出右对齐是默认的格式internal控制负数的符号的位置它左对齐符号右对齐值用空格填满所有中间的空间setfill允许一个字符代替默认的空格来补白输出
iomanip的操作符含义setfill(ch)用ch填充空白setprecision(ch)将浮点精度设置为nsetw(w)读或写值的宽度为w个字符setbase(b)将整数输出为b进制
int i -16;
double d 3.14159;
//补白第一列使用输出中最小12个为主
cout i: setw(12) i next col \n d: setw(12) d next col \n;
//补白第一列左对齐所有列
cout left i: setw(12) i next col \n d: setw(12) d next col \n right; //恢复正常对齐
//补白第一列右对齐所有列
cout right i: setw(12) i next col \n d: setw(12) d next col \n;
//补白第一列但不在域的内部
cout internal i: setw(12) i next col \n d: setw(12) d next col \n;
//补白第一列用#作为补白的字符
cout setfill(#) i: setw(12) i next col \n d: setw(12) d next col \n setfill( );//恢复正常的补白字符输出的结果 i: -16next col d: 3.14159next col i: -16 next col d: 3.14159 next col i: -16next col d: 3.14159next col i: - 16next col d: 3.14159next col i: -#########16next col d: #####3.14159next col 4. 控制输出格式
默认情况下输入运算符会忽略空白符空格符、制表符、换行符、换纸符和回车符
char ch;
while (cin ch)cout ch;如输入
a b c输出则为
abc操纵符noskipws会令运算符读取空白符而不是跳过它们为了恢复默认行为使用skipws操纵符
char ch;
cin noskipws;
while (cin ch)cout ch;如输入
a b c输出则为
a b c5. 单字节操作
我们可以使用get和put来读取和写入一个字符
char ch;
while (cin.get(ch))cout.put(ch);一般情况下在读取下一个值之前标准库保证我们可以退回最多一个值即标准库保证在中间不进行读取操作的情况下能连续调用putback或unget。
函数peek和无参的get以int类型从输入流返回一个字符它首先把要返回的字符先转换为unsigned char然后将结果提升到int。这样返回的int确保是正值。标准库使用负值表示文件尾这可以保证与任何合法字符的值都不同头文件cstdio定义了一个名为EOF的const可以检测从get返回的值是不是文件尾而不用记忆文件尾的实际数值
int ch;
while ((ch cin.get()) ! EOF)cout.put(ch);6. 多字节操作
有时我们需要使用IO操作一次处理大块的数据如果我们需要自己分配并管理用来保存和提取数据的字符数组这些操作容易出错且有时速度也是我们需要考虑的下表给出了多字节操作 get和getline函数接受相同的参数他们的行为类似但不相同在两个函数中sink都是一个charuuzu ,用来保存数据两个函数都一直读取数据直至下面条件之一发生
已读取的size-1字符遇到了文件尾遇到了分隔符 两个函数的差别是处理分隔符的方式get将分隔符留作istream中的下一个字符而getline则读取并丢弃分隔符。无论哪个函数都不会将分隔符保存在sink中。常见的错误是本想从流里删除分隔符但却忘了做。
一个常见的错误是将get或peek的返回值赋予一个char而不是一个int如果在一台char被实现为unsigned char的机器上下面的循环永远不会停止
char ch;
while ((ch cin.get()) ! EOF)cout.put(ch);当get返回EOF时会转换为一个unsigned char转换得到的值和EOF的int不相等循环不会停止。而如果char被实现为signed char的机器上我们不能确定循环的行为。