printf、sprintf、snprintf、fprintf
原文网址:printf、sprintf、snprintf、fprintf_IT利刃出鞘的博客-CSDN博客
简介
xxxprintf函数都是处理字符串的,也就是说,参数必须以’\0’结尾。操作结束后,写入到的文件/buffer都会自动添加上’\0’。
printf
主要功能:打印字符串
函数原型:int printf(const char *format, …);
format的格式:% [flags] [width] [.prec] [F|N|h|l] type
type
type | 对应数据类型 | 含义 |
d/i | int | 有符号的10进制整数,i是老式写法。(正数不输出符号) |
ld | long | 有符号10进制长整形 |
u | unsigned int | 无符号10进制整数 |
lu | long unsigned int | 无符号10进制长整型或unsignedlong |
llu | long long unsigned int | 64位的无符号10进制长长整型。若系统是32位,则用此会出错。 |
o | unsigned int | 无符号8进制整数(不输出前缀o) |
x/X | unsigned int | 无符号16进制整数,x对应的是abcdef, //X对应的是ABCDEF(不输出前缀0x) |
lx | long unsigned int | 无符号16进制长整型 |
llx | long long unsigned int | 64位的无符号16进制长长整型。若系统是32位,则用此会出错。 |
f(lf) | float(double) | 单精度浮点数用f,双精度浮点数用lf(尤其scanf不能混用) |
e/E | double | 科学计数法表示的数,”e”的大小写代表在输出时用的“e”的大小写 |
g/G | double | 以%f或%e/%E中较短的输出宽度输出,且不输出无意义的0. |
c | char | 字符型。可以把输入的数字按誄II码相应转换为对应的字符 |
s/S | char/wchar_t | 字符串。输出字符串中的字符直至字符串中的空字符 //(字符串以’\0‘结尾,这个’\0’即空字符) |
p | void | 以16进制形式输出指针 |
n | int | 到此字符之前为止,一共输出的字符个数,不输出文本 |
% | 无输入 | 不进行转换,输出字符‘%’(百分号)本身 |
m | 无 | 打印errno值对应的出错内容,(例:printf(“%m\n”);) |
flags
flag | 字符名称 | 说明 |
- | 减号 | 左对齐,右边填充空格(默认右对齐)。 例:%-7d 表示输出7位整数左对齐,右边补空格 |
+ | 加号 | 在数字前增加符号 + 或 - |
0 | 数字零
| 输出的前面补上0,直到占满指定列宽为止(不可以搭配使用“-”) 例:printf(“%02d”, i) |
空格 | 输出值为正时加上空格,为负时加上负号 | |
# | 井号 | type 结果 c、s、d、u: 无影响; X: 在输出时加前缀0X; 例:printf(“%#x”, i) |
width
用十进制整数来表示输出的最少位数。
若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0(通过flags控制)。
prec
精度格式符以“.”开头,后跟十进制整数。如果没有给出精度,按 0(零)对待。
如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
prec没指定时:d,i,o,u,x时:没有影响;e,E,f时:不显示小数点
d、o、i、 u、x 或 X : 转换的最少数字显示位数。
e、E或 f : 转换的基数字符后的最少数字显示位数。对于f,是小数位数。
g : 转换的最大有效数字位数。
s : 转换中字符串的最大打印字节数目。
%*.*
“*”*在“.”以前:对于输入
输入时:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值
scanf(“%*d %*d %d”, &n);
如果输入2004 2005 2006
那么n=2006
对于输出
“*”*在“.”之前:用户输入一个位宽值来代替,表示输出的字符所占位宽。
“*”*在“.”之后:表示输出位数,具体的数据来自参数表。printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,
如果没有.,则默认*在.之后。
例1
printf(“%*s”,5,”123”);
输出结果:##123
(#代表一个空格) 相当于5代替了*
例2
char *s = “this is test example”;
int a = 15, b = 10;
printf(“%*.*s\n”, a, b, s);
输出结果:#####this is te
(#代表一个空格)
F|N|h|l
表示指针是否是远指针或整数是否是长整数
F 远指针
N 近指针
h 短整数(short int)
l 长整数(long int) (此处如果与d搭配为%lld则为long long int(C99),与f搭配为%llf则为long double(C99))
[Argument]
包含需要输出的数据,可以是常量(字符常量、数字常量、字符串常量),变量,以及运算式。此处的数据应当与前面的format中的格式控制符一一对应(如果不对应会产生错误)。
printf技巧
\b
printf的\b可以将光标回退一个字节。(backspace)
例1
printf(“1234”);
printf(“\b56”);
输出的结果为:12356 (5将4覆盖)
例2
在同一位置打印数字方法
int i = 0;
printf(“%02u%%”, i);
for(i = 0; i < 100; i++){
printf( “\b\b\b”
“ “
“\b\b\b”
“%02u%%”, i);
}
不能立即输出
有时print不能立即输出原因
unix上标准输入输出都是带有缓存的,一般是行缓存。对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。
ANSI C中定义换行符’\n’可以认为是行刷新标志。所以,printf函数没有带’\n’是不会自动刷新输出流,直至缓存被填满。
解决方法
1、在printf里加”\n”
2、fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上 。
3、setvbuf(stdout,NULL,_IONBF,0); //如果你嫌上个方法麻烦, 就使用这个函数. 直接将缓冲区禁止了. 它就直接输出了
百分数进度
static void print_process_start(float val)
{
float tmp = 0.0;
tmp = val * 100;
printf(“%05.2f%%”, tmp );
}
static void print_process(float val)
{
float tmp = 0.0;
tmp = val * 100;
printf( “\b\b\b\b\b\b”
“ “
“\b\b\b\b\b\b”
“%05.2f%%”, tmp);
}
打印结果:
00.00% => 12.34% => …
unsigned long long
int main()
{
unsigned long long ull = 0x123456789;
unsigned int tmp;
printf(“#x : %#x\n”, ull);
printf(“#llx : %#llx\n”, ull);
tmp = (unsigned int)(ull >> 32);
printf(“H : %#x\n”, tmp);
tmp = (unsigned int)(ull & 0xffffffff);
printf(“L : %#x\n”, tmp);
printf(“(unsigned int)(ull >> 32) : %#x\n”, (unsigned int)(ull >> 32));
printf(“(unsigned int)(ull & 0xffffffff) : %#x\n”, (unsigned int)(ull & 0xffffffff));
printf(“(unsigned int)(ull << 32) : %#x\n”, (unsigned int)(ull << 32));
return 0;
}
用gcc -m32 -o test test.c和gcc -o test test.c编译后,执行./test,结果是:
#x : 0x23456789
#llx : 0x123456789
H : 0x1
L : 0x23456789
(unsigned int)(ull >> 32) : 0x1
(unsigned int)(ull & 0xffffffff) : 0x23456789
(unsigned int)(ull << 32) : 0
sprintf
其他网址:sprintf的使用 - CSDN博客
主要功能:把格式化的数据写入某个字符串中
函数原型:int sprintf(char *str, const char *format, …);
str: 将要写入的字符串指针
format:格式化字符串
… :可选参数,可以是任意类型的数据。对应format里边
返回值:
成功:返回写入buffer 的字符数,结束字符‘\0’不计入内
出错:返回-1. 如果 buffer 或 format 是空指针,函数将返回-1,并且 errno 会被设置为 EINVAL。
示例:
char buf[10];
char *str = “hello”;
int a = 10
sprintf(buf, “%s%d”, str, a)
则buf内容为:”hello10”
snprintf
主要功能:把格式化的数据写入某个字符串中
函数原型:int snprintf(char *str, size_t size,const char *format, …);
str: 将要写入的字符串指针
size:
format:格式化字符串
… :可选参数,可以是任意类型的数据。对应format里边
返回值:
成功:返回想要写入的字符串长度
出错:返回负值。
(1) 若格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符(‘\0’);
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串 结束符(‘\0’),返回值为欲写入的字符串长度。
fprintf
主要功能:格式化输出到一个流/文件中
函数原型:int fprintf(FILE *stream, const char *format, …);
stream:文件指针 (stdin,stdout,stderr为标准输入、输出、错误,可以直接使用)。或者
stream = fopen(“test.txt”,”r+”);
format:格式化字符串
… :可选参数,可以是任意类型的数据。对应format里边
返回值:
成功:输出的字符数
失败:负值
还没有评论,来说两句吧...