C 库 - vsprintf() 函数



C 库函数 vsprintf(char *str, const char *format, va_list arg) 使用传递给它的参数列表将格式化的输出发送到字符串。当需要使用在运行时动态创建的参数列表来格式化字符串时,此函数非常有用。

语法

以下是 C 库函数 vsprintf() 的语法:

int vsprintf(char *str, const char *format, va_list arg);

参数

此函数接受三个参数:

  • *char str: 指向存储结果 C 字符串的缓冲区的指针。缓冲区必须足够大,以容纳结果字符串,包括空终止符。
  • *const char format: 包含要写入字符串 str 的文本的 C 字符串。它可以包含可选的嵌入式格式说明符,这些说明符将被后续参数列表中指定的值替换。
  • va_list arg: 表示可变参数列表的值。这通常使用 va_start 宏初始化,并应传递给 vsprintf。
序号 说明符 & 输出
1

c

字符

2

d 或 i

带符号十进制整数

3

e

使用 e 字符的科学计数法(尾数/指数)

4

E

使用 E 字符的科学计数法(尾数/指数)

5

f

十进制浮点数

6

g

使用 %e 或 %f 中较短的一个

7

G

使用 %E 或 %f 中较短的一个

8

o

带符号八进制数

9

s

字符字符串

10

u

无符号十进制整数

11

x

无符号十六进制整数

12

X

无符号十六进制整数(大写字母)

13

p

指针地址

14

n

不打印任何内容

15

%

字符

序号 标志 & 说明
1

-

在给定的字段宽度内左对齐;右对齐是默认值(参见宽度子说明符)。

2

+

强制在结果前面加上正号或负号(+ 或 -),即使对于正数也是如此。默认情况下,只有负数前面带有负号。

3

(空格)

如果不写入任何符号,则在值前面插入一个空格。

4

#

与 o、x 或 X 说明符一起使用时,对于不同于零的值,其前面分别加上 0、0x 或 0X。与 e、E 和 f 一起使用时,它强制写入的输出包含一个小数点,即使没有数字跟随也是如此。默认情况下,如果没有数字跟随,则不写入小数点。与 g 或 G 一起使用时,结果与 e 或 E 相同,但不会删除尾随零。

5

0

用零 (0) 而不是空格左填充数字,其中指定了填充(参见宽度子说明符)。

序号 宽度 & 说明
1

(数字)

要打印的最小字符数。如果要打印的值短于此数字,则结果将用空格填充。即使结果更大,值也不会被截断。

2

*

宽度未在格式字符串中指定,而是作为在必须格式化的参数之前的附加整数值参数。

序号 .精度 & 说明
1

.数字

对于整数说明符 (d、i、o、u、x、X) - 精度指定要写入的最小位数。如果要写入的值短于此数字,则结果将用前导零填充。即使结果更长,值也不会被截断。精度为 0 表示不为值 0 写入任何字符。对于 e、E 和 f 说明符 - 这是要在小数点后打印的位数。对于 g 和 G 说明符 - 这是要打印的有效数字的最大个数。对于 s - 这是要打印的最大字符数。默认情况下,打印所有字符,直到遇到结束空字符。对于 c 类型 - 它无效。当未指定精度时,默认为 1。如果指定了句点而不指定精度的显式值,则假定为 0。

2

.*

精度未在格式字符串中指定,而是作为在必须格式化的参数之前的附加整数值参数。

序号 长度 & 说明
1

h

参数被解释为 short int 或 unsigned short int(仅适用于整数说明符 - i、d、o、u、x 和 X)。

2

l

对于整数说明符 (i、d、o、u、x 和 X),参数被解释为 long int 或 unsigned long int,对于说明符 c 和 s,参数被解释为宽字符或宽字符字符串。

3

L

参数被解释为 long double(仅适用于浮点说明符 - e、E、f、g 和 G)。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

返回值

该函数返回写入字符串 str 的字符总数,不包括空终止符。如果发生错误,则函数返回负值。

示例 1:简单的字符串格式化

以下代码演示了简单的字符串格式化,其中单个字符串参数被格式化为占位符 %s。

以下是 C 库 vsprintf() 函数的示例。

#include <stdio.h> #include <stdarg.h> void formatString(char *buffer, const char *format, ...) { eva_list args; va_start(args, format); vsprintf(buffer, format, args); va_end(args); } int main() { char buffer[100]; formatString(buffer, "Hello, %s!", "World"); printf("%s\n", buffer); return 0; }

输出

以上代码产生以下结果:

Hello, World!

示例 2:多种数据类型

以下代码演示了使用适当的格式说明符将多种数据类型(字符串、整数和浮点数)格式化到缓冲区中。

#include <stdio.h> #include <stdarg.h> void formatString(char *buffer, const char *format, ...) { va_list args; va_start(args, format); vsprintf(buffer, format, args); va_end(args); } int main() { char buffer[100]; formatString(buffer, "Name: %s, Age: %d, Score: %.2f", "Alice", 30, 95.5); printf("%s\n", buffer); return 0; }

输出

执行以上代码后,我们得到以下结果:

Name: Alice, Age: 30, Score: 95.50

示例 3:处理长字符串

以下代码演示了如何处理和格式化长字符串,确保缓冲区可以容纳整个格式化字符串而不会被截断。

#include <stdio.h> #include <stdarg.h> void formatString(char *buffer, const char *format, ...) { va_list args; va_start(args, format); vsprintf(buffer, format, args); va_end(args); } int main() { char buffer[200]; const char *longString = "This is a very long string that needs to be formatted properly into the buffer."; formatString(buffer, "Formatted String: %s", longString); printf("%s\n", buffer); return 0; }

输出

以上代码的输出如下:

Formatted String: This is a very long string that needs to be formatted properly into the buffer.
广告