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.
廣告