3 回答

TA貢獻(xiàn)1848條經(jīng)驗 獲得超2個贊
這些答案大多數(shù)都解釋了%n 做什么(即不打印任何內(nèi)容并將到目前為止已打印的字符數(shù)寫入int變量),但是到目前為止,還沒有人真正給出其用途的示例。這是一個:
int n;
printf("%s: %nFoo\n", "hello", &n);
printf("%*sBar\n", n, "");
將打?。?/p>
hello: Foo
Bar
Foo和Bar對齊。(在不使用%n此特定示例的情況下,這樣做很簡單,通常總會打斷第一個printf調(diào)用:
int n = printf("%s: ", "hello");
printf("Foo\n");
printf("%*sBar\n", n, "");
稍微增加一點便利是否值得使用深奧的東西%n(可能會引入錯誤)值得商debate。

TA貢獻(xiàn)1942條經(jīng)驗 獲得超3個贊
什么都沒打印。該參數(shù)必須是一個指向帶符號的int的指針,該整數(shù)存儲了到目前為止寫入的字符數(shù)。
#include <stdio.h>
int main()
{
int val;
printf("blah %n blah\n", &val);
printf("val = %d\n", val);
return 0;
}
先前的代碼顯示:
blah blah
val = 5

TA貢獻(xiàn)1809條經(jīng)驗 獲得超8個贊
我還沒有真正看到過該%n說明符在現(xiàn)實世界中的許多實際用途,但是我記得它在很久以前就曾用于格式字符串攻擊的老式printf漏洞中。
這樣的事情
void authorizeUser( char * username, char * password){
...code here setting authorized to false...
printf(username);
if ( authorized ) {
giveControl(username);
}
}
其中,惡意用戶可能會獲得通過到的printf作為格式字符串獲取用戶名參數(shù)的優(yōu)勢和使用的組合%d,%c或W / E去通過調(diào)用棧,然后修改授權(quán)的真實值的變量。
是的,這是一種深奧的用法,但是在編寫守護(hù)程序以避免安全漏洞時總是有用的嗎?:D
- 3 回答
- 0 關(guān)注
- 3729 瀏覽
添加回答
舉報