2017-03-09 48 views
-5

無論輸入什麼字符串,爲什麼輸出始終爲1。 請解釋爲什麼這個C代碼1的輸出?

int main() { 
    char ch[]={}; 
    printf("%d", scanf("%s", ch)); 
    return 0; 
} 
+5

拋開未定義的行爲,這個程序的輸出很大程度上取決於您輸入的內容。如果按下Ctrl + D(在Windows上按Ctrl-Z),程序將打印零。 – dasblinkenlight

+1

您可以通過閱讀「scanf」的任何可用在線參考來輕鬆解決此問題。 – user694733

+2

你是「幸運的」它工作考慮'ch'沒有大小 –

回答

3

手冊頁scanf的:

這些函數返回成功匹配 和分配輸入項目的數量,這可以減少在 甚至是零比規定,或早期匹配失敗的事件。

如果在第一次成功轉換或發生匹配故障時 之前達到輸入的結尾,則會返回值EOF。如果發生讀取錯誤,EOF爲 也會返回,在這種情況下,流的錯誤 指示符(請參閱ferror(3))已設置,並且errno設置爲 表示錯誤。

所以,這意味着scanf()返回成功讀取的項目數。

此外,C不允許零大小的數組。

C11 6.7.6.2組聲明:

第1段:

除了可選的類型限定符和關鍵字靜態的,則[ 和]可限定表達式或* 。如果它們分隔表達式 (其指定數組的大小),則表達式應該具有整數類型 。 如果表達式是一個常量表達式,則其應該具有大於零的值。元素類型不應爲 不完整或函數類型。可選類型限定符和 關鍵字靜態只能在函數 參數的聲明中出現,並且只能在最外面的數組 類型派生中。

+0

這個答案是錯誤的,'char ch [] = {};'在C和C++中都是無效的。零大小的數組是不允許的。看現場演示[這裏](http://coliru.stacked-crooked.com/a/1da9f5b8d1491d45) – Destructor

+0

@Destructor Hellos先生,我添加了關於零大小數組的段落。謝謝你的建議。 – rsp

3

因爲scanf返回它讀取的項目數。在你的情況下,它正在讀取一個字符串,因此它返回1,然後通過printf打印到標準輸出。

+1

您是不是指要閱讀的項目數量? – anonymoose

+0

@anonymoose是的,確切的說。 – hmatar