2013-08-03 71 views
1

我發現這個代碼,看看,printf只有一個參數。並且,它工作!我所有關於printf的知識都是printf(「format」,...);但爲什麼這個代碼工作?任何答案都會有幫助。謝謝。Printf的參數

1 #include <stdio.h> 
    2 
    3 int main() 
    4 { 
    5   char a[]= "hello world"; 
    6   printf(a); 
    7   return 0; 
    8 } 
~   

回答

2

a是格式。然而,這種用法是非常危險的,因爲很多人忘記了a是一種格式,而是認爲它是一個字面字符串。不同之處在於,如果a碰巧包含%,它將被解釋爲一個格式說明符,但您沒有參數可供說明符使用。

當打印printf一個消息字符串,你應該總是做,而不是:

printf("%s", a); 

或者,如果合適的只是使用puts

+0

1爲'的printf( 「%S」,一個);. – jxh

+0

@R ..我知道printf(「%s」,a);我對printf(a)感到困惑,我認爲它永遠不會編譯:)。謝謝。 –

0

a被視爲不包含格式說明符的格式字符串。

通常,printf()將掃描格式字符串,打印任何非格式說明符。當它遇到說明符時,它解碼它,然後從變量參數列表中獲取參數,根據說明符對其進行格式化,然後輸出它,然後在循環中繼續,直到達到字符串的末尾。

由於a不包含格式說明符,因此printf()不從變量參數列表中取得參數。

一般來說,printf()不應該用於以這種方式打印任意字符串。如果程序只打印字符串,可以使用fputs()代替:

fputs(a, stdout); 
0

printf是一個帶有可變參數列表的函數。第一個參數是一個被解析以查找格式細節的字符串。在你給出的例子中,沒有格式化細節(以%開頭的字段)。因此,沒有更多的參數需要打印和代碼工作。

0

int printf (const char * format, ...);

是用必需的參數,format並且可以是一個列表或零個或更多的元件,通過...表示的列表的參數的函數。

因此,printf(a);是簡單地printf()呼叫只用必要的參數。