2012-10-10 71 views
4

由於printf功能而言,我理解從一些參考和實驗以下。錯誤格式說明

  • 當我們試圖與用於浮法(或)格式說明雙和副打印的整數值反之亦然的行爲是不可預知的
  • 但是可以使用%c來打印整數值的等效字符。也可以使用%d打印字符的ASCII值(整數表示)是可以接受的。

同樣,什麼是scanf的行爲,如果有格式說明的不匹配,並通過了arguements到SCANF。標準是否定義了它?

回答

4

變量參數(匹配省略號的變量,...)爲默認提升。這意味着所有較短的整數類型都被提升爲int(或根據需要未經簽名)。 inte ­ gers和字符(I believe)之間沒有區別。在printf%d%c之間的區別是價值僅僅是如何格式化

scanf是魚的不同水壺。你通過的所有參數是指針。指針之間沒有默認的專業版,並且傳遞與指針對象的類型匹配的確切格式說明符至關重要。

在這兩種情況下,如果你的格式說明不匹配提供的參數(如傳遞一個int *%pprintf),其結果是不確定的行爲,遠遠比做「不可預知」雪上加霜 - 這意味着你的計劃簡直是格格不入。

+2

我不確定「不合格」是描述它的最好方法。如果行爲未定義,則您的程序基本上不正確,但實施並不需要警告您。 –

+0

「在printf()中將'int *'傳遞給'%p'」可能不是最具說教性的例子,因爲許多C程序員認爲它是正確的。首先使用一個更明顯錯誤的例子可能會更好(例如'int *'到'%f'),然後可能包含將'int *'傳遞給'%p'的信息在技術上也是不正確的。 –

+0

@PascalCuoq:嗯,我認爲這恰恰是教學法,因爲很多人錯誤地認爲這是正確的。 –

0

首先,由於促進,對應於轉換規格的類型可能不相同,被傳遞給函數的類型。例如,字符被提升爲整數,因此printf(「%c」)真的期望一個int,然後將其轉化爲一個無符號的字符。直接傳遞一個int與將該int傳遞給一個unsigned char相同,因此是安全的。

如果參數沒有預期的類型,例如,如果你傳遞一個浮動,而不是一個整數,那麼結果是不確定的。

它與scanf()的特別是災難性的,因爲自變量是指針。如果通過,當函數需要一個指向float的指針時,說一個指向char的指針,然後該函數將嘗試在一個1字節的位置寫入(比方說)4個字節,這很糟糕。你很可能會遇到段錯誤。