2012-10-01 150 views
-5

在C語言中,出來下面的程序是%5 %%, 但我不知道怎麼做?C printf格式字符串

printf("%6%5%%%78%"); 
+5

你不知道怎麼回事? –

+3

我可能是錯的,但它看起來不像'printf'的有效格式字符串...,而對於C99§7.19.6.1¶9,「如果轉換規範無效,行爲未定義。」 。 –

+0

@AxelIsouard他可能意思是'我不知道爲什麼'。 – Dan

回答

6

這是未定義的行爲,是編譯器/平臺特定的。具有錯誤參數的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] 
+0

但是,我在Dev編譯器上運行此聲明,成功運行。我在考試中得到了這個問題,他們也在測試後才提出這個問題。 –

+4

@AsdAsd:「任何事情都可能發生,程序不合格」和「編譯」之間並不矛盾。想想,只要需要。這是一個非常重要的問題。 –

+2

@Asd:只是因爲某些*出現*才能運行正常,並不意味着它是正確的。你也應該考慮在一所更好的學校換個課程,如果你把這種事情當作考試問題的話。 –

3

格式化字符串之後,應當相等數量的這顯然不是在這裏完成的論點。

可能的參數,以格式化字符串是:

%[flags][width][.precision][length]specifier 

其中說明符是小號Ç等其他是可選的。

標誌是+, - ,0等之一,用於左對齊或右對齊,其中沒有一個在問題中傳遞。

精度前綴爲。,所以在這個例子的情況下,它是失敗的。

讓我們看一下

printf("%6%5%%%78%"); 
  • 現在%後的第一個參數被作爲場即6的寬度和 因此不印刷。但是,它期望一個說明符後者代替 ,其中找到另一個%。標準說%跟着%打印它到標準輸出 。因此,你首先看到打印%。現在因爲%的影響是 丟失,所以5被作爲一個正常的數字處理和打印。

  • 然後我們看到%%會打印一個%。接下來又是一個 %,其次是78,這是預期的寬度,因此不打印。 但是,後面的另一個%會否定78的效果並打印出單個%。

爲了這裏驗證上述評估是一個測試字符串

printf("%6%4%3%2"); 

它打印%4%2符合以上。

詳細參考 printf

0

什麼可能發生在這裏的是:

  • 的printf的執行看見「%6」,它可以是一個有效的轉換規範的開始,如「%6D 」。
  • 然後它看到「%」,這不再是一個有效的轉換規範。此時該字符串不符合C標準(例如C 1999 7.19.6。1 8表示「完整的轉換規範應爲%%」),並且實現可以做任何事情。這個特定的實現看起來忽略了「6」,並且好像轉換規範是「%%」而不是「%6%」。因此,它將「%」寫入標準輸出。
  • 然後printf實現看到「5」,所以它寫入「5」。
  • 然後它會看到「%%」,這是導致寫入「%」的有效轉換規範。
  • 然後它看到「%78%」。與「%6%」一樣,「%78」可以開始有效規範,但第二個「%」錯誤。實施再次忽略了「78」並寫入「%」。

該行爲在其他C實現中會有所不同。該方案不合格;它不符合C標準,其行爲不是由C標準規定的。