printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf,
wprintf, fwprintf, swprintf, vwprintf, vfwprintf, vswprintf, |
格式化规定符
%d 十进制有符号整数
%f 浮点数
%s 字符串
%e 指数形式的浮点数
%g 自动选择合适的表示法
************************printf***************************
printf()函数是式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。正在编写步骤时经常会用到此函数。
printf()函数的挪用式样为: printf("<式样化字符串>",<参量表>);
#include<stdio.h>
#include<string.h>
intmain( void )
{
charc,s[20],*p;
inta=1234,*i;
floatf=3.141592653589;
doublex=0.12345678987654321;
p= "Howdoyoudo" ;
strcpy (s, "Hello,Comrade" );
*i=12;
c= '\x41' ;
printf ( "a=%d\n" ,a); /*结果输出十进制整数a=1234*/
printf ( "a=%6d\n" ,a); /*结果输出6位十进制数a=1234*/
printf ( "a=%06d\n" ,a); /*结果输出6位十进制数a=001234*/
printf ( "a=%2d\n" ,a); /*a超过2位,按实际值输出a=1234*/
printf ( "*i=%4d\n" ,*i); /*输出4位十进制整数*i=12*/
printf ( "*i=%-4d\n" ,*i); /*输出左对齐4位十进制整数*i=12*/
printf ( "i=%p\n" ,i); /*输出地址i=06E4*/
printf ( "f=%f\n" ,f); /*输出浮点数f=3.141593*/
printf ( "f=%6.4f\n" ,f); /*输出6位其中小数点后4位的浮点数
f=3.1416*/
printf ( "x=%lf\n" ,x); /*输出长浮点数x=0.123457*/
printf ( "x=%18.16lf\n" ,x); /*输出18位其中小数点后16位的长浮点
数x=0.1234567898765432*/
printf ( "c=%c\n" ,c); /*输出字符c=A*/
printf ( "c=%x\n" ,c); /*输出字符的ASCII码值c=41*/
printf ( "s[]=%s\n" ,s); /*输出数组字符串s[]=Hello,Comrade*/
printf ( "s[]=%6.9s\n" ,s); /*输出最多9个字符的字符串s[]=Hello,
Co*/
printf ( "s=%p\n" ,s); /*输出数组字符串首字符地址s=FFBE*/
printf ( "*p=%s\n" ,p); /*输出指针字符串p=Howdoyoudo*/
printf ( "p=%p\n" ,p); /*输出指针的值p=0194*/
getch();
retunr0;
}
|
************************printf***************************
************************fprintf***************************
函数完整形式:
1
2 |
int fprintf( FILE *stream,constchar*format,[argument])
其中, FILE *stream为文件指针,constcahr*format以什么样的格式输出,[argument]为输入列表
|
int fprintf( FILE *stream, const char *format, ... );
fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件. fprintf()只能和printf()一样工作. fprintf()的返回值是输出的字符数,发生错误时返回一个负值.
示例一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
/* Program to create backup of the AUTOEXEC.BAT file */
#include <stdio.h>
int main( void )
{
FILE *in, *out;
if ((in = fopen ( "\\AUTOEXEC.BAT" , "rt" )) == NULL)
{
fprintf (stderr, "Cannot open input file.\n" );
return 1;
}
if ((out = fopen ( "\\AUTOEXEC.BAT" , "wt" )) == NULL)
{
fprintf (stderr, "Cannot open output file.\n" );
return 1;
}
while (! feof (in))
fputc ( fgetc (in), out);
fclose (in);
fclose (out);
return 0;
}
|
示例二
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
#include <stdio.h>
#include<stdlib.h>
#include <process.h>
FILE *stream;
int main( void )
{
int i = 10;
double fp = 1.5;
char s[] = "this is a string" ;
char c = '\n' ;
stream = fopen ( "fprintf.out" , "w" );
fprintf ( stream, "%s%c" , s, c );
fprintf ( stream, "%d\n" , i );
fprintf ( stream, "%f\n" , fp );
fclose ( stream );
system ( "type fprintf.out" );
return 0;
}
|
屏幕输出:
1
2
3 |
this is a string
10
1.500000
|
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
#include <stdio.h>
int main()
{
FILE *fp;
int i=617;
char * s = "that is a good new" ;
fp = fopen ( "text.dat" , "w" );
fputs ( "total" ,fp);
fputs ( ":" ,fp);
fprintf (fp, "%d\n" ,i);
fprintf (fp, "%s" ,s);
fclose (fp);
return 0;
}
|
输出
1
2 |
total:617
that is a good new
|
************************fprintf***************************
************************sprintf***************************
字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。
int sprintf( char *buffer, const char *format, [ argument] … );
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]...:可选参数,可以是任何类型的数据。
int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format, [argument] ... );
int _sprintf_s_l(char *buffer,size_t sizeOfBuffer,const char *format,locale_t locale ,[argument] ... );
int _swprintf_s_l(wchar_t *buffer,size_t sizeOfBuffer,const wchar_t *format,locale_t locale ,[argument]…);
template <size_t size>
int sprintf_s(char (&buffer)[size],const char *format, [argument] ... ); //仅存在于C++
template <size_t size>
int swprintf_s(wchar_t (&buffer)[size],const wchar_t *format ,[argument]...); //仅存在于C++
例子
1
2
3
4
5
6
7
8
9
10
11 |
#include<stdio.h>//某个头文件
intmain() /*主函数“整数”类型*/
{
charbuffer[50]; /*“字符”类型的数组,下面共有50个元素。*/
intn,a=5,b=3; /*三个变量都为“整数”类型,intn中间要有空格*/
n= sprintf (buffer, "%dplus%dis%d" ,a,b,a+b); /*赋予数值*/
printf ( "[%s]isastring%dcharslong\n" ,buffer,n); /*“格式输出”*/
return0; /*“返回零”
也就是程序正常退出*/
}
|
输出结果:
[5 plus 3 is 8] is a string 13 chars long |
************************sprintf***************************
************************snprintf***************************
int snprintf(char *str, size_t size, const char *format, ...);
将可变个参数(...)按照format格式化成字符串,然后将其复制到str中
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为格式化后的字符串的长度。
char a[20];
i = snprintf(a, 9, "%012d", 12345);
printf("i = %d, a = %s", i, a);
输出为:i = 12, a = 00000001
strcpy() sprintf() strcat() 存在安全隐患, 其对应的安全版为:
strncpy() snprintf() strncat()
1 |
snprintf(s, 100, "%.*S" , 3, "abcd" );
|
s的值为abc
%.*s 表示有两项, 第一项指定了长度,第二项则是%s的内容,所以取前三位
在VS2008中需在预编译处加入
1
2
3 |
#if _MSC_VER
#define snprintf _snprintf
#endif
|
通用ANSI UNICODE 通用定义
6例子
1
2
3
4
5
6
7
8 |
#include<stdio.h>
#include<stdlib.h>
intmain()
{
charstr[10]={0};
snprintf(str, sizeof (str)-1, "0123456789012345678" );
printf ( "str=%s\n" ,str);return0;
}
|
运行结果:str=012345678
************************snprintf***************************
************************vprintf***************************
vprintf
标准库函数vprintf函数与printf函数类似,所不同的是,它用一个参数取代了变长参数表,且此参数通过调用va_start宏进行初始化。同样,vfprintf和vsprintf函数分别与fprintf和sprintf函数类似。
函数名: vprintf
功 能: 送格式化输出到stdout中
用 法: int vprintf(char *format, va_list param);
程序例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 |
#include<stdio.h>
#include<stdarg.h>
intvpf( char *fmt,...)
{
va_list argptr;
int cnt;
va_start (argptr,fmt);
cnt= vprintf (fmt,argptr);
va_end (argptr);
return (cnt);
}
intmain( void )
{
int inumber=30;
float fnumber=90.0;
char *string= "abc" ;
vpf( "%d%f%s\n" ,inumber,fnumber,string);
return0;
}
|
************************vprintf***************************
|