發表文章

目前顯示的是 8月, 2018的文章

利用 printf 來把值寫入某個變數

在 C 語言中,透過 printf 來印東西一點都不稀奇。但你知道 printf 也可以拿來寫值嗎?? 看看下面的範例,看看會印出來什麼東西。 #include "stdio.h" int main() { int val; printf("bala %n bala\n", &val); printf("val = %d\n", val); return 0; } 印出來的結果如下: blah  blah val = 5 為什麼呢?如果我們去查 manual 的話,可以看到下面的定義: n The number of characters written so far is stored into the integer indicated by the int * (or variant) pointer argument. No argument is converted. 也就是使用 %n 的時候,他會把 到目前為止已經印出多少個字元的數目給寫入一個 int 的變數 。常見的做法在於對齊,如下面的程式 int n; printf("%s: %nFoo\n", "hello", &n); printf("%*sBar\n", n, " "); 但只有這樣嗎?其實,%n 也可以拿去寫值到程式內特定的記憶體位置喔,只要你好好的處理 pointer 的部分的話。所以 printf 其實比想像的還要危險呢。