發表文章

目前顯示的是 八月, 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 其實比想像的還要危險呢。