2016-03-18 32 views
-6

我無法理解下面的代碼。用字符串替換printf中的格式

#include<stdio.h> 
int main() 
{ 
    char *a ="%d"; 
    int c = 5; 
    printf(a,c); 
} 

在我看來,那printf函數應該是這樣的:printf(%d,c).我知道這是一種奇怪的,但實際上它可以正常運行。誰爲printf函數添加了雙引號?或者是char * a與雙引號存儲在一起?

+0

'誰爲printf函數添加了雙引號?'這是一個什麼樣的問題?這是標準中規定的,不是嗎? –

+0

當你在寫一個printf的內部時,它會用「%d」替換它,這就是它正常工作的原因。 –

+0

雙引號是定義文字[tag:c]字符串的方式....'a'將指向一個3字節的內存:[[0] =%[1] = d [2] ='\ 0'作爲第一個參數,[printf](http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm)希望存儲一個以NULL結尾的字符串的有效地址。 – LPs

回答

2

沒有人實際添加引號。 printf期望作爲第一個參數是char*。通常這是通過向printf提供字符串文字來提供的。

考慮,而不是你提出的解決方案:

printf("%d\n", c); 

這不是某人添加引號,而是相反。會發生什麼是編譯器將"%d\n"識別爲字符串文字,它存儲(不帶引號和任何字符,如'\ n'用實際的換行符替換 - 因此它存儲百分號,'d',a換行字符和一個NUL字符)放在可執行文件的某個位置,並使用指向該位置的指針,然後將其用作printf的參數。