sprintf 是个变参函数

来源:互联网 发布:幻影骑士吼狼淘宝 编辑:程序博客网 时间:2024/06/12 01:35

字串格式化命令,主要功能是把格式化的数据写入某个字符串中。

由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。

1,头文件:stdio.h

函数原型:int sprintf( char *buffer, const char *format, [ argument] … );

参数列表:

buffer:char型指针,指向将要写入的字符串的缓冲区。

format:格式化字符串。

[argument]...:可选参数,可以是任何类型的数据。


返回值:字符串长度(strlen)

相关函数

int   sprintf_s(char  *buffer,size_t  sizeOf  Buffer, const char *format, [argument] ... );

int   _sprintf_s_l(char  * buffer, size_t  sizeOf  Buffer,const   char  *format, locale_t   locale ,[argument] ... );

int   swprintf_s(wchar_t  *buffer,  size_t  sizeOf  Buffer,  const   wchar_t   *format , [argument]...);

int   _swprintf_s_l(wchar_t   *buffer, size_t   sizeOf   Buffer,  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++


2,参数说明及应用举例:

sprintf格式的规格如下所示。[]中的部分是可选的。

%[指定参数][标识符][宽度][.精度]指示符

若想输出`%'本身时, 请使用`%%'处理。

1. 处理字符方向。负号时表示从后向前处理。

2. 填空字元。 0 的话表示空格填 0;空格是内定值,表示空格就放着。

3.字符总宽度。为最小宽度。

4. 精确度。指在小数点后的浮点数位数。


3,转换字符

%% 印出百分比符号,不转换。

%c 整数转成对应的 ASCII 字元。

%d 整数转成十进位。

%f 倍精确度数字转成浮点数。

%o 整数转成八进位。

%s 整数转成字符串。

%x 整数转成小写十六进位。

%X 整数转成大写十六进位。


4,sprintf 是个变参函数,定义如下:

int sprintf( char *buffer, const char *format [, argument] ... );

除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:

格式化字符串上。

printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。


格式化数字字符串

sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,sprintf 在大多数场合可以替代

itoa。

如://把整数123 打印成一个字符串保存在s 中。

sprintf(s, "%d", 123); //产生"123"


字符/Ascii 码对照

以下程序段把所有可见字符的ASCII 码对照表打印到屏幕上(这里采用printf,注意”#”与”%X”合用时自动为16 进制数增加”0X”前缀):

for(int i = 32; i < 127; i++) {

printf("[ %c ]: %3d 0x%#04X\n", i, i, i);

}


连接字符串

char* who = "I";

char* whom = "CSDN";

sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. "


打印地址信息

有时调试程序时,我们可能想查看某些变量或者成员的地址,由于地址或者指针也不过是个32 位的数,你完全可以使用打印无符号整数的”%u”把他们打印出来:

sprintf(s, "%u", &i);

不过通常人们还是喜欢使用16 进制而不是10 进制来显示一个地址:

sprintf(s, "%08X", &i);

然而,这些都是间接的方法,对于地址打印,sprintf 提供了专门的”%p”:

sprintf(s, "%p", &i);


利用sprintf 的返回值

较少有人注意printf/sprintf 函数的返回值,但有时它却是有用的,spritnf 返回了本次函数调用最终打印到字符缓冲区中的字符数目。也就是说每当一次sprinf 调用结束以后,你无须再调用一次strlen 便已经知道了结果字符串的长度。如:

int len = sprintf(s, "%d", i);

对于正整数来说,len 便等于整数i 的10 进制位数。



0 0
原创粉丝点击