回答
這是未定義的行爲,是編譯器/平臺特定的。具有錯誤參數的Printf函數將開始從堆棧中翻譯變量,然後會發生任何事情。
這就是爲什麼編譯器通常會抱怨這個
source.c:5:5: warning: conversion lacks type at end of format [-Wformat]
source.c:5:5: warning: conversion lacks type at end of format [-Wformat]
source.c:5:5: warning: conversion lacks type at end of format [-Wformat]
source.c:5:5: warning: spurious trailing '%' in format [-Wformat]
但是,我在Dev編譯器上運行此聲明,成功運行。我在考試中得到了這個問題,他們也在測試後才提出這個問題。 –
@AsdAsd:「任何事情都可能發生,程序不合格」和「編譯」之間並不矛盾。想想,只要需要。這是一個非常重要的問題。 –
@Asd:只是因爲某些*出現*才能運行正常,並不意味着它是正確的。你也應該考慮在一所更好的學校換個課程,如果你把這種事情當作考試問題的話。 –
格式化字符串之後,應當相等數量的這顯然不是在這裏完成的論點。
可能的參數,以格式化字符串是:
%[flags][width][.precision][length]specifier
其中說明符是小號爲串,Ç爲炭等其他是可選的。
標誌是+, - ,0等之一,用於左對齊或右對齊,其中沒有一個在問題中傳遞。
精度前綴爲。,所以在這個例子的情況下,它是失敗的。
讓我們看一下
printf("%6%5%%%78%");
現在%後的第一個參數被作爲場即6的寬度和 因此不印刷。但是,它期望一個說明符後者代替 ,其中找到另一個%。標準說%跟着%打印它到標準輸出 。因此,你首先看到打印%。現在因爲%的影響是 丟失,所以5被作爲一個正常的數字處理和打印。
然後我們看到%%會打印一個%。接下來又是一個 %,其次是78,這是預期的寬度,因此不打印。 但是,後面的另一個%會否定78的效果並打印出單個%。
爲了這裏驗證上述評估是一個測試字符串
printf("%6%4%3%2");
它打印%4%2符合以上。
詳細參考 printf
什麼可能發生在這裏的是:
- 的printf的執行看見「%6」,它可以是一個有效的轉換規範的開始,如「%6D 」。
- 然後它看到「%」,這不再是一個有效的轉換規範。此時該字符串不符合C標準(例如C 1999 7.19.6。1 8表示「完整的轉換規範應爲%%」),並且實現可以做任何事情。這個特定的實現看起來忽略了「6」,並且好像轉換規範是「%%」而不是「%6%」。因此,它將「%」寫入標準輸出。
- 然後printf實現看到「5」,所以它寫入「5」。
- 然後它會看到「%%」,這是導致寫入「%」的有效轉換規範。
- 然後它看到「%78%」。與「%6%」一樣,「%78」可以開始有效規範,但第二個「%」錯誤。實施再次忽略了「78」並寫入「%」。
該行爲在其他C實現中會有所不同。該方案不合格;它不符合C標準,其行爲不是由C標準規定的。
- 1. 解析Objective-C printf格式字符串?
- 2. 將C++ printf格式轉換爲VB .NET字符串格式
- 3. printf浮點值的字符串格式
- 4. 通過printf格式輸出字符串
- 5. PHP:使用printf格式化字符串
- 6. 如何將C風格的printf格式轉換爲C#字符串格式?
- 7. C - 格式字符數組像printf
- 8. C:僅使用字符串格式作爲參數的printf
- 9. 用於生成printf格式字符串的C宏
- 10. 查找C++字符串中的第一個printf格式序列
- 11. C printf字符串說明符\ t1?
- 12. 格式化C字符串
- 13. 格式字符串在C#
- 14. C#字符串格式
- 15. c#字符串格式
- 16. 格式字符串.NET C#
- 17. C++格式字符串宏
- 18. 字符串格式化C#
- 19. C#格式的字符串
- 20. 格式字符串C++
- 21. C#+字符串格式化
- 22. C printf格式化
- 23. 預解析(高速緩存)printf風格的格式字符串
- 24. 用字符串替換printf中的格式
- 25. 什麼是固定字符串的printf格式?
- 26. 當通過'%c'打印換行符時,Printf部分忽略格式字符串
- 27. 傳遞字符串給printf,在C
- 28. printf()將不會打印字符串c
- 29. C - 結構數組的printf字符串
- 30. 字符串和字符與printf的
你不知道怎麼回事? –
我可能是錯的,但它看起來不像'printf'的有效格式字符串...,而對於C99§7.19.6.1¶9,「如果轉換規範無效,行爲未定義。」 。 –
@AxelIsouard他可能意思是'我不知道爲什麼'。 – Dan