正在經歷一些舊代碼,發現:printf/snprintf格式字符%N做什麼? (未%N)
char buf[...];
int i = 1, j =2;
snprintf(buf, "%d-blah_%d-blah_%N", i, j);
注意只有兩個傳遞可變參數的參數,但3個格式字符串。
它打印
1-blah_2-blah_0
不能在任何文檔中找到它。 %N做什麼?
正在經歷一些舊代碼,發現:printf/snprintf格式字符%N做什麼? (未%N)
char buf[...];
int i = 1, j =2;
snprintf(buf, "%d-blah_%d-blah_%N", i, j);
注意只有兩個傳遞可變參數的參數,但3個格式字符串。
它打印
1-blah_2-blah_0
不能在任何文檔中找到它。 %N做什麼?
根據標準文件(例如POSIX printf)它沒有任何定義(因此%N
可能是undefined behavior,並且在標準中肯定是未指定的行爲)。
然而,GNU glibc提供customizing printf
能力。您的程序可能已註冊(其他地方)register_printf_function需要處理%N
。這是不是標準是GNU glibc
具體 (然而,這是一個方便的伎倆,但你不能教GCC format
function attribute知道那招)。
它在微軟的CRT一個有趣的案例。似乎發生的事情是%N
被視爲大小說明符,但最後它會被忽略。
可以在<VSDIR>/VC/crt/src/output.c
找到源和VS2013,你會發現下面幾行:
enum CHARTYPE {
...
CH_SIZE, /* 'h', 'l', 'L', 'N', 'F', 'w' */
...
};
'N'
也在查找狀態表中。 The documentation says nothing about it,也沒有提及'F'
。在源代碼(case ST_SIZE
)事實證明'N'
,'F'
和'L'
(儘管文檔!)的仔細檢查都是無操作大小調節劑。
所以,針對你的情況VS2013你會得到1-blah_2-blah_
,無尾0
是'%N'甚至事?我很難找到它的參考。 – tadman 2014-11-24 20:12:46
您可能看到未定義的行爲,或者您看到特定於實現的擴展。你使用什麼編譯器? – 2014-11-24 20:12:47
@OliverCharlesworth在CentOS上的簡潔的GCC。沒什麼特別的。 snprintf似乎來自stdio.h。 – marathon 2014-11-24 20:15:14