
- C 標準庫
- C 庫 - 首頁
- C 庫 - <assert.h>
- C 庫 - <complex.h>
- C 庫 - <ctype.h>
- C 庫 - <errno.h>
- C 庫 - <fenv.h>
- C 庫 - <float.h>
- C 庫 - <inttypes.h>
- C 庫 - <iso646.h>
- C 庫 - <limits.h>
- C 庫 - <locale.h>
- C 庫 - <math.h>
- C 庫 - <setjmp.h>
- C 庫 - <signal.h>
- C 庫 - <stdalign.h>
- C 庫 - <stdarg.h>
- C 庫 - <stdbool.h>
- C 庫 - <stddef.h>
- C 庫 - <stdio.h>
- C 庫 - <stdlib.h>
- C 庫 - <string.h>
- C 庫 - <tgmath.h>
- C 庫 - <time.h>
- C 庫 - <wctype.h>
- C 標準庫資源
- C 庫 - 快速指南
- C 庫 - 有用資源
- C 庫 - 討論
- C 程式設計資源
- C 程式設計 - 教程
- C - 有用資源
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)。 |
返回值
該函式返回寫入字串 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.