printf()函數的type是%n時,不是表示列印資料,而是将列印資訊的數量儲存到指定的變量中,需要注意的是,在printf()函數中使用%n時,其對應的參數是變量的位址。
1 打開%n的開關
當printf()使用%n時,會有不安全的隐患,是以,預設情況下,%n是不能使用的。如果需要使用,則要打開%n的開關。
1.1 擷取%n的開關狀态
通過_get_printf_count_output()函數擷取目前%n的開關狀态。如果%n是不能使用,則傳回值是0,否則傳回值是1。
1.2 設定%n的開關狀态
通過_set_printf_count_output()函數設定%n的開關狀态。當該函數的參數是0時,則關閉%n的開關,如果參數是非零值,則打開%n的開關。_set_printf_count_output()函數的傳回值是修改之前的%n的開關狀态,不能使用,則傳回值是0,否則傳回值是1。
2 使用%n
以下代碼在printf()中使用了%n
int a;
int e;
e = _get_printf_count_output();
if (e == 0)
{
_set_printf_count_output(1);
}
printf("12345%n", &a);
此時,a的值是%n之前的字元串的長度,即此時a的值是5。如果%n的位置變為
printf("123%n45", &a);
此時,a的值是%n之前的字元串的長度,即a的值是3。