现在,让我们来看看C++的格式控制语法
ostream 类是从ios派生而来的,而ios则是从ios_base派生来的
ios_base类存储了描述格式状态信息,所以
很多的格式控制都需要ios_base类作为引导例如,
控制整数以十进制,十六进制,八进制显示,
可以使用dec,hex,oct控制符,如下:
int a=10;
cout<
您可能以为cout< 运行结果如下: 使用width()可以修改字符的宽带,其方法原型如下: width(i)中,i是宽带的长度,当然width只能影响下一个项目,然后字符宽度将自动恢复为默认值如下代码: 运行结果: fill()成员函数可以用来改变填充字符,例如: 运行结果如下: 您可能对于 所以凡是由于使用VS等一些较新的编译器会带来报错提示,可能对您的心情有一定影响,请谅解 在一些老师布置的作业要求或者一些学校的OJ题目上,他们可能对于一些精度有着变态的要求,这通常会对C++学习者造成了困扰 precison是显示有效位的成员函数int b=100,a=10;
cout<
a是十六进制的a,十进制中的10,b是16进制的64,10进制的100
可以看到这种方法会影响后面的所有项目,除非您再次进行修改格式2.修改字符宽度
int width();
int width(int i);
cout<<'#';
cout.width(10);
cout<<10<<'#'<<50<<"#\n";
可以看到width只影响到了后一个项目
同时widt(i),i的参数可以是const 类型,也可以是#define类型3.填充字符
cout.fill(’@’)
在某些情况下,这种填充方式会很受用
测试代码如下:cout.fill('@'); //填充@字符
char *str[3]={"这里识别不出来","有几个","号"};
int num[3]={500,600,700};
for(int i=0;i<=2;i++) //3次循环
{
cout<
可以看到运行结果,width指定了5个宽度,
而数组num每一个字符只有3个宽度,
不满足5个,由于提前使用了cout.fill('@')进行填充,
所以前面的两位都变成了'@'
char *str[3]={"这里识别不出来","有几个","号"};
这串代码有些不屑,当然本章只是对于C++的一些字符控制进行讲解4.设置浮点数的显示精度
原型如下:
int precison();
precison(int i);
其中i可以是const也可以是#define宏定义过的
测试代码如下: float price1=10.45,price2=1.5+5.0/6.0;
cout<<"pricel = "<
其中precsion函数会自动省略小数点后面的
ios_base提供了setf函数(用于set标记),能够控制多种格式化特性,此外ios_base函数提供了多个常量,可做setf函数的参数个数
如下面一行代码使cout显示末尾小数点
cout.setf(ios_base::showpoint);
当然,也会显示末尾位0的,测试代码如下:
float price1=10.40,price2=1.5+5.0/6.0;
cout<<"pricel = "<
可以看到通过setf函数输出了.
5.1 setf其他方法
setf有两种原型:
fmtflags setf(fmtlags);
fmtflags setf(fmtflags,fmtflags);
先来讲第一种:
fmtflags是bitmask类型的typedef名,用于存储格式标记,
该名称还是在ios_base类中定义的
bitmask类型是一种用来存储各个位置的类型,可以是整形,
枚举,甚至可以说是STL bitset容器
下表是fmtflag setf(fmtlags)的一些常量控制和格式控制
常量
含义
ios_base::boolapha
输出和输入bol值
ois_base::showpoint
显示末尾小数点
ios_base::uppercase
大写字母输出16进制
ios_base:showbase
输出C++基数前缀
ios_base::showpos
正数前面加上’+'号
测试其中几个函数,代码如下:
int s=20;
cout.setf(ios_base::showpos);
cout<<"s = "<
当然使用showpos,uppercase,showbase等都需要ios_base进行解析,而使用ios_base则需要编译指令或者编译声明
测试结果:
下面介绍第二种:
fmtlags setf(fmtflags,fmtflas);
和第一种不同的是,这种格式会返回以前的设置,第二种第一个参数和第一种一样,而第二种则需要清除指定第一个参数的那些位置
下面函数调用和16进制控制符作用相同
cout.setf(ios_base::hex,ios_base::basefield);
第一参数
第二参数
含义
ios_base::dec
ios_base::basefield
使用十进制基数
ios_base::oct
ios_base::basefield
使用八进制基数
ios_base::hex
ios_base::basefield
使用16进制基数
第一参数
第二参数
含义
ios_base::fixed
ios_base::floatfield
定点计数法
ios_base::scientifc
ios_base::floatfield
使用科学计数法
ios_base::left
ios_base::adjustfield
使用左对齐
ios_base::right
ios_base::adjustfield
使用右对齐
ios_base::internal
ios_base::adjustfield
符号或者基数前缀左对齐,值右对齐
根据上表,现在您是否能看懂如下代码:
ios_base::fmtflags old;
old=cout.setf(ios::left,ios::adjustfield);
如果想要回复以前的设置可以这样:
cout.setf(old,iso::adjustfield);
测试代码:
int main()
{
cout.setf(ios_base::left,ios_base::adjustfield);//左对齐
cout.setf(ios_base::showpos); //加上'+'号
cout.setf(ios_base::showpoint); //显示末尾小数
cout.precision(3); //显示3位有效位
ios_base::fmtflags old=cout.setf(ios_base::scientific,
ios_base::floatfield); //16进制控制符
cout<<"左对齐!"<
测试结果:
当然上面的代码想要运行别忘记了cmath头文件和iostream头文件
6.标准控制符表(参考)
控制符
引用
boolalpha
setf(ios_base::boolalpha
noboolalpha
unset(ios_base::noboolalpha)
showbase
setf(ios_base::showbase
noshowbase
nusetf(ios_::showbase
showpoint
noshowpoint
unsetf(ios_base::showpoint
showpos
setf(ios_base::showpos)
noshowpos
unsetf(ios_base::showpos)
uppercase
setf(ios_base::uppercase)
nouppercase
unsetf(ios_base::uppercase)
internal
setf(ios_base::internal,ios_base::adjustfield)
fixed
setf(ios_base::fixed,ios_base::floatfield)
scientific
setf(ios_base::scientific,ios_base::floatfield)
如果系统支持则可以使用,否则继续使用setf();
当然,您可能注意到了标准控制符和前面的控制符差别所差无几,并且和一些英文单词几乎相同,所以都是便于学习者方便记住的