2014-01-09 52 views
0

我試圖跳過BOM以UTF-8編碼的文件,但我在IFS測試失敗:C/C++ - 符號字符比較

int i = 0; 

if(str[i] == '\0xef') { 
    ++i; 
} 

if(str[1] == '\0xbb') { 
    ++i; 
} 

if(str[2] == '\0xbf') { 
    ++i; 
} 

我不知道爲什麼他們不這樣做工作。在簽名和未簽名之間必須存在某種隱式轉換,並且Visual Studio在調試時顯示帶有2個字節的字符代碼,即使我使用1個字節的字符。

發生了什麼事?謝謝:)

+1

''\ 0xbf''是多字節字符常量 –

+0

如何定義str?它是帶符號還是無符號字符數組? – Marian

+0

這是一個const char *。我也試過0xbf而不是'\ 0xbf',但結果是一樣的。 – Virus721

回答

3

你的代碼應該是

int i = 0; 

if(str[i] == 0xef) { 
    ++i; 
} 

if(str[1] == 0xbb) { 
    ++i; 
} 

if(str[2] == 0xbf) { 
    ++i; 
} 
+0

感謝您的回答。我已經嘗試過這種可能性,但它導致了同樣的可能性。 – Virus721

1

定義十六進制字符常量的正確途徑是'\xef'。您的str應保持簽署在這種情況下。

if(str[i] == '\xef') { 
    ++i; 
} 

,也可以定義爲strunsigned char *與之比較的整數0xef(所建議的Chinna)。

+0

感謝您的幫助。我也嘗試過,但如果測試失敗了。 – Virus721

1

問題是常量在此上下文中被解釋爲一個整數,因此得到值239,而字符是符號擴展的。由於char在大多數x86編譯器(包括Visual Studio)上簽名,位模式0xef被解釋爲負數,因此在擴展時產生-17。這兩個數字不相等。

試試這樣做:if ((unsigned char)str[i] == '\xef')

+0

謝謝,我會試試這個。 – Virus721