2014-01-09 48 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