c语言按照顺序输出数字(中的数字输出格式)
前言
习惯了使用C 之后是真的愿意用cout代替printf,但是cout又不能像printf那样可以]啊,%-5d这种,那么可以浅用几种方式来进行有效的格式表示。
setw
字段宽度。也就是说等同于]这种的存在的。
头文件:#include<iomanip>
- cout << setw(5) << 123 << endl;
- cout << setw(5) << 123 << setw(3) << 45 << endl;
- cout << setw(5) << 123456 << endl;
第一行的意思是:
一共占据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;
那么第一行结果就是: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;
首先上文提到fixed与setiosflags(ios::fixed)是一样的。
其次,我们发现,fixed改变了cout的输出格式,但是仅限于double或float,int无效的,不会将100变成100.000000。
而scientific则是科学计数法,见名知意嘛。
cout << scientific << a << endl;
cout << a <<endl;
这里要提的是科学计数法的表示,就是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;
如果不加,就是有效数字;如果加了,就是保留小数了。
第三行只是将其改变回来正常的输出。
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;
我们的输出默认是十进制dec,而如果加入了hex就变成了十六进制,55=0x37。
此时的cout完全变成了输出十六进制,道理同fixed。
如果想恢复十进制只需要cout<<dec;即可。
showbase
cout << hex << showbase << b << endl;
cout << hex << noshowbase << b << endl;
cout << dec << noshowbase;
showbase意思是,如果不是十进制,那么就把该数字的前缀显示出来。
而我们默认是noshowbase,因此最后一样的意思是回复原始。————————————————
left/right
setw默认的是靠近右侧,但是如果想左侧怎么办呢?cout << setw(5) << left << 123 << endl;
cout << setw(6) << 123 << endl;
cout << setw(5) << right << 123 << endl;
使用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