C/C++ snprintf 用法與範例

本篇 ShengYu 介紹 C/C++ snprintf 的用法與範例,C/C++ 可以使用 snprintf 格式化輸出到 buffer 裡,除此之外還可以指定輸出的字元數。

C/C++ 要使用 snprintf 的話需要引入的標頭檔 <stdio.h>,如果要使用 C++ 的標頭檔則是引入 <cstdio>
snprintf 函式原型為

1
int snprintf(char * buffer, size_t n, const char * format, ...);

buffer:指向一塊字元陣列的指標,格式化輸出的結果字串輸出到這裡,該 buffer 需要足夠的空間存放結果。
n:指定輸出的最大字元數。
format:format 是格式控制字串,format 可被隨後的附加參數中指定的值替換,並按需求進行格式化,跟 printf 的 format 用法一樣。
…:可變引數 argument,依序替換 format 中的格式化種類。

C/C++ snprintf 格式化輸出基本用法

這邊介紹 C/C++ snprintf 格式化輸出的基本用法,snprintf 函式會在中將格式化輸出的一連串字元存到 buffer 裡。隨後的每個引數 argument 是根據 format 中的對應格式進行轉換和輸出。

使用 sprintf 的話沒有方法可以限制寫入的字元數,這表示使用 sprintf 撰寫出的程式碼很容易發生緩衝區溢位。跟 sprintf 相比 snprintf 可以指定要寫入 buffer 的字元數。

這邊介紹 C/C++ snprintf 格式化輸出,例如將數字格式化輸出成字串到 buffer 裡、將浮點數格式化輸出成字串到 buffer 裡,

cpp-snprintf.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// g++ cpp-snprintf.cpp -o a.out
#include <stdio.h>

int main() {
char buf[128] = {0};
const char str[] = "hello world";
char c = 'a';
int num = 123;
float f = 5.4321f;

snprintf(buf, 128, "string: %s\n", str);
printf("%s", buf);

snprintf(buf, 128, "character: %c\n", c);
printf("%s", buf);

snprintf(buf, 128, "integer: %d\n", num);
printf("%s", buf);

snprintf(buf, 128, "float: %f\n", f);
printf("%s", buf);

return 0;
}

結果輸出如下,

1
2
3
4
string: hello world
character: a
integer: 123
float: 5.432100

這邊再介紹一個範例,有時需要將一些資料格式化輸出並且連接在一起,這時可以使用 snprintf 搭配 strcat,snprintf 將資料格式化輸出到 tmp 後,再使用 strcat 連接 tmp 到 buf 裡,最後再用 printf 輸出結果,詳見下列範例,

cpp-snprintf2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// g++ cpp-snprintf2.cpp -o a.out
#include <stdio.h>
#include <string.h>

int main() {
char hex[] = {0x01, 0x02, 0x03, 0x1a, 0x2b, 0x3c};
char tmp[128] = {0};
char buf[128] = {0};

for (int i = 0; i < sizeof(hex); i++) {
snprintf(tmp, sizeof(tmp), "0x%02x, ", hex[i]);
strcat(buf, tmp);
}
printf("hex : %s\n", buf);

return 0;
}

輸出結果如下,

1
hex : 0x01, 0x02, 0x03, 0x1a, 0x2b, 0x3c,

以上就是 C/C++ snprintf 的用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它參考
snprintf - C++ Reference
https://www.cplusplus.com/reference/cstdio/snprintf/

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
C/C++ sprintf 用法與範例
C/C++ strcat 用法與範例