2015-06-10 59 views
5

我最近寫了一個簡單的程序,我錯誤地使用scanf()而不是printf()在控制檯上顯示消息。我期待得到編譯時錯誤,但它編譯好沒有在運行時崩潰&崩潰。我知道scanf()用於從鍵盤輸入。我不應該在下面的程序中遇到錯誤嗎?爲什麼要傳遞字符串scanf()在C中編譯好?

#include <stdio.h> 
int main() 
{ 
    scanf("Hello world"); // oops, It had to be printf() 
    return 0; 
} 

它調用未定義的行爲(UB)嗎? C標準中有沒有提到這個?爲什麼在編譯時沒有檢查是否將適當的&有效參數傳遞給scanf()函數?

+0

無法重現崩潰。該程序運行良好。 – EOF

+0

該代碼看起來對我來說是正確的,並且應該在編譯和運行時正常完成。你怎麼知道它'崩潰'?什麼是碰撞症狀? – CiaPan

+1

我敢肯定,語法暗示:沒有失敗編譯和*沒有*崩潰 –

回答

6

該代碼行爲正確。事實上,scanf聲明

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

幸運的是,你的format不包含任何%對此有將是...沒有對應,這將調用UB。
此外,format是一個字符串字面值,它允許編譯器通過它,確保您針對格式說明符傳遞正確類型的參數,作爲啓用更高警告級別的智能檢查的一部分。 (-Wformat家庭)

-1

scanf does take a string paramater。這就是爲什麼它編譯好,但看起來你的參數不符合它的期望,所以它在運行時崩潰(或只是退出)。

+4

我真的懷疑它崩潰......爲什麼呢? 'scanf'只是從輸入中讀取字符並將它們與格式字符串進行比較。當比較失敗時,'scanf'返回一些錯誤 - 但不會'崩潰'。 – CiaPan

4

編譯器無法讀取您的想法。

printf("Hello world")scanf("Hello world")都是格式良好的。

6

將字符串傳遞到scanf編譯罰款,因爲scanf預計一個字符串作爲其第一個參數。有關詳細說明,請參閱文檔或編程手冊。

相關問題