c printf类函数探幽 fprintf sprintf snprintf

printf,   fprintf,   dprintf,  sprintf,  snprintf

vprintf,  vfprintf,vdprintf, vsprintf, vsnprintf 

函数原型

#include <stdio.h>

int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int dprintf(int fd, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);

#include <stdarg.h>

int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vdprintf(int fd, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);

%规则

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

type:常见的是d(整形),c(单个字符),s(字符串),p(指针),x(地址)

width:宽度。n,不够会填充空格,0n,左边会填充0。

flags:输出样式。默认输入右对齐。-:输出左对齐,+会显示+或-。一个空格,会显示-,不显示+号

.perc:表示小数位数。先满足.perc,再满足width

F:远指针

N 近指针

h 短整数或单精度浮点数

l 长整数或双精度浮点数

1.printf

这个最简单

int a = 100;
printf("a = \d",a);

2.fprintf

向文件流中打印

FILE* fp;
fp = fopen("test.txt","w");
int a = 100;
//向文件流中打印
fprintf(fp, "a = %d", a);
//向标准输出打印
fprintf(stdout, "a = %d", a);

3.dprintf

向文件描述符写入文本

int fd;
fd = open("test.txt",O_RDWR);
dprintf(fd, "hello world");

4.sprintf

向字符串写入文本,没有进行长度控制,主要程序员自行控制

char buf[256];
sprintf(buf,"hello world");

5.snprintf

向字符串写入文本,有长度控制

char buf[256];
snprintf(buf,sizeof(buf),"hello world");

6.vprintf    

//可以自定义格式化打印

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

void WriteFrmtd(char *format, ...)
{
	char buf[256];
   va_list args;
   snprintf(buf, sizeof(buf), "%s-%d-%s\n",format,1,"lalala");

   va_start(args, format);
   
   vprintf(buf, args);
   
   va_end(args);
}

int main()
{
	float buf = 111.0;
	int num = 0;

	WriteFrmtd("hello world");
	return 0;
}

vfprintf, vdprintf, vsprintf, vsnprintf结合fprintf和vprintf可以自行理解。

特殊用法

%n可以计算前面打印字符的数量

float buf = 111.0;
int num = 0;
printf("%fhel%nlo\n",buf,&num);
printf("num = %d\n",num);

猜你喜欢

转载自blog.csdn.net/qq_34759481/article/details/81775860