您的位置:首页 > 编程语言 > C语言/C++

C/C++中的%010u是个什么东东?

2016-06-05 12:12 906 查看
       遇到这样一个小需求, 需要将无符号的整数(最大值是4294967295, 是个10位数)转为字符串, 不足10位时, 前面补0.  比如:

0000000000   <---0

0000000001   <---1

0000000002   <---2

0000000003   <---3

0000000004   <---4

0000000005   <---5

0000000006   <---6

0000000007   <---7

0000000008   <---8

0000000009   <---9

0000000010   <---10

0000000011   <---11

0000000012   <---12

0000000013   <---13

0000000014   <---14

0000000015   <---15

0000000016   <---16

0000000017   <---17

0000000018   <---18

0000000019   <---19

4294967295   <---4294967295

4294967294   <---4294967294

4294967293   <---4294967293

4294967292   <---4294967292

4294967291   <---4294967291

4294967290   <---4294967290

4294967289   <---4294967289

4294967288   <---4294967288

4294967287   <---4294967287

4294967286   <---4294967286

      

      这个很简单, 不足就补呗。 但是, 当我看到这样一个实现后, 我懵逼了, 没见过啊, 一起来看看:

#include <stdio.h>
#include <string.h>

int main()
{
unsigned int i = 0;
unsigned int n = 20;
for(i = 0; i < n; i++)
{
printf("%010u <---%u\n", i, i);
}

int count = 0;
for(i = ((1<<32) -1);; i--)
{
count++;
if(count > 10)
{
break;
}

printf("%01u <---%u\n", i, i);
}

return 0;
}
      结果就是:
0000000000   <---0

0000000001   <---1

0000000002   <---2

0000000003   <---3

0000000004   <---4

0000000005   <---5

0000000006   <---6

0000000007   <---7

0000000008   <---8

0000000009   <---9

0000000010   <---10

0000000011   <---11

0000000012   <---12

0000000013   <---13

0000000014   <---14

0000000015   <---15

0000000016   <---16

0000000017   <---17

0000000018   <---18

0000000019   <---19

4294967295   <---4294967295

4294967294   <---4294967294

4294967293   <---4294967293

4294967292   <---4294967292

4294967291   <---4294967291

4294967290   <---4294967290

4294967289   <---4294967289

4294967288   <---4294967288

4294967287   <---4294967287

4294967286   <---4294967286

     虽然对C/C++的格式化串比较熟悉, 但%010u还真是第一次见, 于是找了度娘, 找到了:

format

Format 参数是包含三种对象类型的一个字符串:

* 无格式字符复制到输出流;

* 转换规范,每个规范导致在值参数列表中检索 1 个或更多个项;

* 转义序列。

通常意义上format的格式如下:

%[flags][width][.prec][F|N|h|l]type

规定输出数据的格式,具体如下:[1] 


type

type的字符用于规定输出数据的类型,含义如下:
字符对应数据类型含义
d / iint接受整数值并将它表示为有符号的十进制整数,i是老式写法
ounsigned int无符号8进制整数(不输出前缀0)
u
unsigned int无符号10进制整数
x / X
unsigned int无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF(不输出前缀0x)
f(lf)
float(double)单精度浮点数用f,双精度浮点数用lf(尤其scanf不能混用)
e / E
double科学计数法表示的数,此处"e"的大小写代表在输出时用的“e”的大小写
g / G
double使用以上两种中最短的形式,大小写的使用同%e和%E
c
char字符型。可以把输入的数字按照ASCII码相应转换为对应的字符
s / S
char * / wchar_t *字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符)
p
void *以16进制形式输出指针
nint *到此字符之前为止,一共输出的字符个数,不输出文本
%
无输入不进行转换,输出字符‘%’(百分号)本身
m打印errno值对应的出错内容,(例: printf("%m\n"); )
注:%g、%G在小数点位数四位或指数大于等于精度时用%e、%E,否则用%f。


flags

flags 规定输出样式,取值和含义如下:
字符
字符名称说明
-减号左对齐,右边填充空格(默认右对齐)
+
加号在数字前增加符号 + 或 -
0
数字零将输出的前面补上0,直到占满指定列宽为止(不可以搭配使用“-”)  





 空格输出值为正时加上空格,为负时加上负号
#
井号type是o、x、X时,增加前缀0、0x、0X

type是e、E、f、g、G时,一定使用小数点

type是g、G时,尾部的0保留


width

用于控制显示数值的宽度,取值和含义如下:

n(n=1,2,3,4,5,6...): 宽度至少为n位,不够以空格填充。

* 格式列表中,下一个参数还是width

width是一个可选的指定最小值字段宽度的十进制数字字符串。如果转换值字符少于字段宽度,该字段将从左到右按指定的字段宽度填充。如果指定了左边调整选项,字段将在右边填充。如果转换结果宽于字段宽度,将扩展该字段以包含转换后的结果。不会发生截断。然而,小的精度可能导致在右边发生截断。


prec

用于控制小数点后面的位数,取值和含义如下:

无按缺省精度显示0

当type=d,i,o,u,x时,没有影响;

type=e,E,f时,不显示小数点

n(n=1,2,3...)

当type=e,E,f时表示的最大小数位数;

type=其他,表示显示的最大宽度

prec是指可选的精度。精度是一个 .(点)后跟十进制数字字符串。如果没有给出精度,按 0(零)对待。精度指定:

* d、o、i、 u、x 或 X 转换的最少数字显示位数。

* e 和 f 转换的基数字符后的最少数字显示位数。

* g 转换的最大有效数字位数。

* s 转换中字符串的最大打印字节数目。


F|N|h|l

表示指针是否是远指针或整数是否是长整数

F 远指针

N 近指针

h 短整数(short int)

l 长整数(long int) (此处如果与d搭配为%lld则为long long int(C99),与f搭配为%llf则为long double(C99))

 就这样, 吃饭咯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: