前言
此文章中會整理所有在 C/C++ printf 的相關用法,包含 printf, fprintf, sprintf, snprintf,
以及 vprintf, vfprintf, vsprintf, vsnprintf,會比較他們之間的差別,以及提供程式碼範例。
我們一共會介紹這些:
- printf, fprintf, sprintf, snprintf
- vprintf, vfprintf, vsprintf, vsnprintf
先講結論
給新手、還沒有很注重「程式執行使用系統空間」的開發者結論
如果你是 C/C++ 新手,或是還沒有很注重「程式執行使用系統空間」的開發者,
這篇基本上不用看了XD,你只要記得「printf」、「fprintf」、「sprintf」的差別就好!
他們可以幫助你打天下!
如果你是好奇 v 開頭的那系列
vprintf, vfprintf, vsprintf, vsnprintf ,我們可以仔細觀察,
與 printf, fprintf, sprintf, snprintf 只差一個開頭的 「 v 」,
這個 v 代表的是使用 va_list 的意思,也就是說,我們使用了「不限定傳入參數數量的方法」。
也就是說,我們寫好了一個 function,他可以同時接受傳入 1, 2, 3…各種數量的參數。
知道這個概念即可,其他的就與原來「沒有 v」的相同。
最後, printf, fprintf, sprintf, snprintf 的快速結論
function | 主要特色 |
---|---|
prinf | 基本用法,直接顯示在 terminal 上 |
fprinf | 「檔案相關」才會用到 |
sprinf | 將值「傳入第一個變數」中 |
snprinf | 將值「傳入第一個變數」中,n代表可以控制傳入大小,作為系統空間管理較為安全 |
printf
定義
簡單來說,就是直接印出來 (在你的 terminal 上),
可以說是基本中的基本用法XD。
> printf
int printf ( const char * format, ... );
Print formatted data to stdout
Writes the C string pointed by format to the standard output (stdout).
If format includes format specifiers (subsequences beginning with %),
the additional arguments following format are formatted and inserted in the resulting string replacing their respective specifiers.
> http://www.cplusplus.com/reference/cstdio/printf/
範例程式碼 – printf
這邊直接使用官方範例,裡面其實有講到很多格式調整的部份,
但這裡就先不特別講 (太多內容XD。而且會偏題),之後會有另外一篇文特別去寫。
#include <stdio.h>
using namespace std;
void test_printf()
{
char s[] = "Hello";
printf("Strings - padding:\n");
printf("\t.%10s.\n\t.%-10s.\n\t.%*s.\n", s, s, 10, s);
printf("Strings - truncating:\n");
printf("\t%.4s\n\t%.*s\n", s, 3, s);
printf("Characters:\t%c %%\n", 65);
printf("Integers\n");
printf("Decimal:\t%i %d %.6i %i %.0i %+i %i\n", 1, 2, 3, 0, 0, 4, -4);
printf("Hexadecimal:\t%x %x %X %#x\n", 5, 10, 10, 6);
printf("Octal:\t\t%o %#o %#o\n", 10, 10, 4);
printf("Floating point\n");
printf("Rounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3);
printf("Padding:\t%05.2f