c语言按照顺序输出数字(中的数字输出格式)

前言

习惯了使用C 之后是真的愿意用cout代替printf,但是cout又不能像printf那样可以]啊,%-5d这种,那么可以浅用几种方式来进行有效的格式表示。

setw

字段宽度。也就是说等同于]这种的存在的。

头文件:#include<iomanip>

  1. cout << setw(5) << 123 << endl;
  2. cout << setw(5) << 123 << setw(3) << 45 << endl;
  3. cout << setw(5) << 123456 << endl;

c语言按照顺序输出数字(中的数字输出格式)(1)

第一行的意思是:

一共占据5个空格区域,其中123贴在右侧。

将会以:空空123的形式展示出来。

第二行想说明的的是:

setw必须是紧贴着要输出的内容进行格式控制,setw 要输出的内容,必须是在它的后面紧挨着。

123是5个空格空间,而后面的45就只有3个空格空间而已。

将会以:空空123空45的形式显示。

第三行想说明的是:

如果数字超过了控制范围,那么就都说没控住...

还是会以正常的123456显示。

————————————————

setfill

将空格填充为特定的字符,与setw配合使用。

要注意的是:首先填充的必须是字符,char类型。

其次,可以单独使用。

cout << setw(5) << left << setfill('-') << 123 << endl;

cout << setw(5) << setfill('-') << 1.5 << endl;

cout << setw(6) << 100 << endl;

c语言按照顺序输出数字(中的数字输出格式)(2)

那么第一行结果就是:123--。

而第二行是:1.5--,小数点也会占据一个空格位置。

第三行我们并没有指明setfill,但是输出的结果却是:100---。

那么到这里,结合刚才的left,也认为,setfill会改变输出格式,只不过改变的是此后的setw。

但是话说回来,你的left、right以及setfill,在没有使用setw的情况下,对cout是没影响的,因为不涉及到占位。

cout << setfill(' ') << right;//恢复原来的默认

cout << setw(6) << 100 << endl;

默认填充的是空格,以及右侧贴靠,这样就变回了原始的setw。

————————————————

setiosflags

设置指定标志。

这个需要很多参数,来组成不同的形式。

首先头文件还是<iomanip>

但是在实际使用中发现,例如此后的内容fixed,我们写:

setiosflags(ios::fixed)与直接写fixed是一样的。

cout << setiosflags(ios::fixed) << 123.456 << endl;

cout << fixed << 123.456 << endl;

————————————————

fixed/scientific

fixed指的是:流的格式化。

将流的格式设置为:fixed,意思是:

将一个浮点数表示为,一个定点整数和小数点和小数部分的格式。

值得注意的是,在C语言中,小数是默认是保留6位,但是C 可以直接输出,省去了后面无意义的0,但是用了fixed之后,就又变成了123.456000。

double a = 123.456;

cout << a << endl;

cout << fixed << a << endl;

cout << a << endl;

c语言按照顺序输出数字(中的数字输出格式)(3)

首先上文提到fixed与setiosflags(ios::fixed)是一样的。

其次,我们发现,fixed改变了cout的输出格式,但是仅限于double或float,int无效的,不会将100变成100.000000。

而scientific则是科学计数法,见名知意嘛。

cout << scientific << a << endl;

cout << a <<endl;

c语言按照顺序输出数字(中的数字输出格式)(4)

这里要提的是科学计数法的表示,就是e加上三个字符的表示,其中,符号占1位。

其次,scientific与fixed是一样的,改变了cout。

那么问题来了:咋变回去呢?

那么就要用到resetiosflags了,这个貌似是不能省略的,不能像fixed一样。

因为我们如果用了其他形式的输出,是要恢复成原样的。

cout << resetiosflags(ios::scientific);

//cout << resetiosflags(ios::scientific) << resetiosflags(ios::fixed);

cout << a <<endl;

就是将最后一次的修改变为正常,如果你忘了是改成什么样子了,可以两个都反修改。

————————————————

setprecision

这个函数的意思是,保留多少位有效数字,例如123.456如果保留5位有效数字的话,就变成了:123.46,进行四舍五入。

这里就可以讲:如果我们想保留的是小数呢?

例如说是我想把123.456变成123.456000这种。

就要用fixed与setprecision相结合的方式。

double a = 123.456;

cout << setprecision(5) << a << endl;

cout << fixed << setprecision(5) << a << endl;

cout << resetiosflags(ios::fixed) << setprecision(5) << a << endl;

c语言按照顺序输出数字(中的数字输出格式)(5)

如果不加,就是有效数字;如果加了,就是保留小数了。

第三行只是将其改变回来正常的输出。

hex/dec/oct

hex是十六进制,dec是十进制,oct是八进制。

先来句题外话,这个怎么记住呢?我认为还是挺有意思的,这个好像是我考研英语老师讲的。

说啊~在很久以前的国外是没有一月和二月的(但是具体是因为什么我不记得了...),因此以前是March是一月,那么以这个逻辑以此类推,October就不是十月了,就是八月了,诶,你会发现,octopus意思是八爪鱼,也是oct开头,那么oct就是八的前缀~

再推,December是十二月,变成了十月,decade意思是十年对吧,你看,dec就是十的前缀!

你看学到英语了还!

至于hex我不知道,貌似人家本身就有十六进制的意思,不过我记得hex好像是炉石里萨满的妖术那张牌...

言归正传!!!

int b = 55;

cout << b << endl;

cout << hex << b << endl;

cout << b << endl;

cout << oct << b << endl;

cout << dec;

cout << b << endl;

c语言按照顺序输出数字(中的数字输出格式)(6)

我们的输出默认是十进制dec,而如果加入了hex就变成了十六进制,55=0x37。

此时的cout完全变成了输出十六进制,道理同fixed。

如果想恢复十进制只需要cout<<dec;即可。

showbase

cout << hex << showbase << b << endl;

cout << hex << noshowbase << b << endl;

cout << dec << noshowbase;

c语言按照顺序输出数字(中的数字输出格式)(7)

showbase意思是,如果不是十进制,那么就把该数字的前缀显示出来。

而我们默认是noshowbase,因此最后一样的意思是回复原始。————————————————

left/right

setw默认的是靠近右侧,但是如果想左侧怎么办呢?cout << setw(5) << left << 123 << endl;

cout << setw(6) << 123 << endl;

cout << setw(5) << right << 123 << endl;

c语言按照顺序输出数字(中的数字输出格式)(8)

使用std标准库里的left。

这里要说明一下:我们可能看到的都是std::left,但是只要我们把std命名空间在前面声明打开了之后,直接使用left是可行的。

那么输出从空空123,变成了123空空。

第二行我们看到,并没有输入left,也是靠左侧了!

这就是说明left(以及下面的right)直接改变了cout的输出格式,使得以后的cout全部按照这种形式输出。当然了,left和right仅适用于setw函数存在的情况。

right同理于left,但是我们默认就是右侧,所以正常在没有写过左侧的情况,是不用写出来的,使用的意义可能在于恢复原始的右侧对齐...

————————————————

总结

setprecision和setw的使用次数还是很多的,如果我们改变了cout,一定不要忘记改回来!

今天的分享就到这里了~感谢大家~

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页