C語言中具有不定參數個數的函數定義,因此可以很靈活地定義一些不確定實參個數的函數。像C標准庫中的printf函數就是如此。
在某些時候,比如在做嵌入式設備,我們自己開發一套打印調試數據的接口(比如通過UART或USB),如果自己完全根據printf中的數據格式來寫比較浪費時間和資源。幸虧C語言標准庫中提供了vsprintf庫函數能夠將標准的格式字符串與后面的參數自動組織成printf輸出的字符串式樣。這樣我們可以直接通過使用這個庫函數來寫自己定制的輸出函數。
請參照以下代碼:
#include <stdio.h> #include <stdarg.h> static void MyPrint(const char *s, ...) { char buffer[512]; // 分配512字節的字符串緩存 va_list ap; va_start(ap, s); vsprintf(buffer, s, ap); // 將格式字符串與后面的參數綁定為一個字符串,拷貝到輸出緩存 va_end(ap); // 這里寫自己的打印輸出函數,比如這里用puts puts(buffer); } int main(void) { MyPrint("Hello, the value is: %d, %s, %f", 100, "OK", -0.5f); }
上述代碼就用puts標准庫函數來模擬自定義的輸出打印函數。應該說非常簡單。