va_list與格式化輸出
va_list
文章目錄
- va_list與格式化輸出
- va_list
- 格式化輸出
- snprintf
- vsnprintf
- vasprintf
- 實例
va_list是在C語言中解決變參問題的一組宏,變參問題是指參數的個數不定,可以是傳入一個參數也可以是多個
用法:在函數里定義va_list 型的變量 ,這個變量是指向參數的指針 ,通過指針運算來調整訪問的對象
相關操作:
va_list:傳入參數,輔助獲取參數;
va_start:對參數進行初始化;
va_arg:從參數列表一個一個取出;
av_end: 結束可變參數的獲取,清空 va_list
【注意】:
- 函數本身無法知道參數類型以及參數的數量;
- 對于沒有定義轉移字的非POD,使用變長函數會導致未定義;
示例:
int SumOfFloat(int cnt, ...) {va_list ap;int sum = 0;va_start(ap, cnt);for (int i = 0; i < cnt; ++i) {sum += va_arg(ap, int);}va_end(ap);return sum;
}int main() {cout << SumOfFloat(3, 12, 10, 1) << endl;return 0;
}
格式化輸出
snprintf
snprintf,用于格式化字符串,并將結果存儲到一個字符數組中
/*
str:用于存儲格式化后的字符串。
size:這是目標字符數組的最大容量。
format:格式化字符串。
...:這是可選的參數。
*/
int snprintf(char *str, size_t size, const char *format, ...);
#include <iostream>
#include <stdlib.h>
int main() {char buffer[50];int a, b;std::cin >> a >> b;int c = a + b;int result = snprintf(buffer, sizeof(buffer), "%d+%d=%d", a , b , c);if (result >= 0 && result < sizeof(buffer)) {printf("result format: %s\n", buffer);} else {printf("error.\n");}return 0;
}
vsnprintf
snprintf不同的是它允許你使用變長參數列表(va_list)來傳遞參數。
/*
str:用于存儲格式化后的字符串。
size:這是目標字符數組的最大容量。
format:這是一個格式化字符串
ap:va_list 類型的參數。
*/
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
vasprintf
vasprintf可以通過可變參數創建一個格式化的字符串,并將其存儲在動態分配的內存中。
/*
str用于存儲格式化字符串的結果。
format:格式化字符串的格式。
ap:va_list 類型的參數。
*/
int vasprintf(char **str, const char *format, va_list ap);
實例
void format(const char* fmt , ...){va_list al;va_start(al , fmt);format(fmt , al);va_end(al);
}
void format(const char* fmt , va_list al){char* buf = nullptr;int len = vasprintf(&buf , fmt , al);if(len != -1){m_ss << std::string(buf , len);free(buf);}
}