2010-10-23 43 views
0

有人可以向我解釋以下事件嗎?兩行STRLEN printf?

unsigned int i; 
i = strlen("testData"); 
printf("%d\n", i); 

Output: 
8 
5 

爲什麼打印額外的5?

[更新:]閱讀評論後,我愚蠢地意識到5來自哪裏,對不起!

+3

您可以發佈完整的程序嗎? – 2010-10-23 21:09:31

+0

請採取這個brainfart學習:總是提供一個小的,獨立的,可編譯的(除了關於編譯器錯誤的問題,當然)程序,展現你未能理解的行爲。 IME,大多數情況下,創建這樣的repro-case使你自己發現錯誤,並防止你浪費每個人的時間。如果沒有 - 那麼,你已經創建了repro case來與這裏一起詢問。現在成爲一個好公民並刪除這個無用的問題。 – sbi 2010-10-23 21:22:31

回答

1

strlen代表字符串長度。現在,我們來看...「testData」。

1 - 't' 2 - 'e' 3 - 's' 4 - 't' 5 - 'D' 6 - 'a' 7 - 't' 8 - 'a'. 

我們統計8.
現在我是8

So, printf("%d\n", i);
打印8.

再後來,你在你的程序一些代碼,打印5.不能告訴你爲什麼因爲我看不到代碼

0

一個可能的解釋是你有未定義的行爲,因爲您正在使用有符號整數的格式規範(%d),但傳遞了unsigned int參數。正確的printf電話是:

printf("%u\n", i); 

雖然不太可能,一種可能的解釋是,被印在額外5您的實現結果的不確定的行爲。

+0

它真的是未定義的行爲?因爲標準說INT和無符號INT具有相同的位表示...只是好奇,它是從標準證明,這是UB? – 2010-10-23 21:14:37

+0

@Armen Tsirunyan:您必須參考C標準,因爲這是定義'fprintf' /'printf'函數接口的地方。 ISO/IEC 9899:1999 7.19.6.1針對轉換說明符「d','i'說:」int'參數是...「和後面的」如果任何參數不是相應轉換的正確類型規範,行爲是未定義的「。雖然我沒有C90交易,但我不相信這個方面從那以後發生了變化。 – 2010-10-23 21:24:35

0

此代碼片段應該只是打印8.除此代碼部分外還有其他內容可以打印5