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的字符用于规定输出数据的类型,含义如下:
注:%g、%G在小数点位数四位或指数大于等于精度时用%e、%E,否则用%f。
flags 规定输出样式,取值和含义如下:
用于控制显示数值的宽度,取值和含义如下:
n(n=1,2,3,4,5,6...): 宽度至少为n位,不够以空格填充。
* 格式列表中,下一个参数还是width
width是一个可选的指定最小值字段宽度的十进制数字字符串。如果转换值字符少于字段宽度,该字段将从左到右按指定的字段宽度填充。如果指定了左边调整选项,字段将在右边填充。如果转换结果宽于字段宽度,将扩展该字段以包含转换后的结果。不会发生截断。然而,小的精度可能导致在右边发生截断。
用于控制小数点后面的位数,取值和含义如下:
无按缺省精度显示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 短整数(short int)
l 长整数(long int) (此处如果与d搭配为%lld则为long long int(C99),与f搭配为%llf则为long double(C99))
就这样, 吃饭咯。
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 / i | int | 接受整数值并将它表示为有符号的十进制整数,i是老式写法 |
o | unsigned 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进制形式输出指针 |
n | int * | 到此字符之前为止,一共输出的字符个数,不输出文本 |
% | 无输入 | 不进行转换,输出字符‘%’(百分号)本身 |
m | 无 | 打印errno值对应的出错内容,(例: printf("%m\n"); ) |
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))
就这样, 吃饭咯。
相关文章推荐
- C++作业7-函数复习
- C++第7次作业
- 1104. Sum of Number Segments (20)
- C++第七次实验——作业
- C++第7次实验-函数复习
- dijkstra算法C语言实现
- c++实验7-特殊三位数
- C++第十五周实践项目2————洗牌
- 跟我一起学C++之从C到C++(const限定符)
- C++第七次实验——项目2
- C语言之define
- poj之旅——3258C++
- 跟我一起学C++之从C到C++(bool类型)
- 完美cvCreateVideoWriter写出AVI文件为空的问题
- C++第7次实验
- 非系统消息的使用方法及SendMessage()和PostMessage()的区别
- C++,笔试面试,使用C++编程,实现万年历
- C/C++,笔试面试,多种方法求100以内的所有素数
- 使用C语言编写程序,求解有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个序列的前20项
- C语言头文件的写作方法和说明