今天写code,遇到很有意思的关于字符串赋值的一个问题。
由于需要比对节目名,于是初始化一个字符串数组,其中有个节目的名字是Barça TV,但是ç无法在ultraedit中显示,于是使用16进制的UTF8码做初始化如下:
string[] = {“”…”Bar\xc3\xa7a TV"};
结果编译出错:hex escape sequence out of range
g了下,说到
#include <stdio.h>
int main()
{
char buffer[] = "\x53est\x03t";
int i;
for(i=0;i <6;i++)
{printf("%c\n",buffer[i]);}
}
这样会有警告 [Warning] C:\Program Files\C-Free 4\temp\未命名1.c:4: warning: escape sequence out of range for character
但是输出还是
>
而为什么"\x53est\x03t"这个字符串会报:
Compiling...
test.cpp
E:\test\test.cpp(4) : error C2022: '1342' : too big for character
Error executing cl.exe.
test.exe - 1 error(s), 0 warning(s)
这样一个错误,也就是说这个时候编译器将\x53e进行了转义,根据这个道理,依次类推:
如果字符串是"\x53efst\x03t",编译器将\x53ef进行转义。
进一步可以推理:
如果是char b='\x53ef'也会出现上述类似的编译错误。
由此可以看出,VC的编译器对\xhh的转义其实不是说\x后面只有两位数进行转义,而是说\x后面紧挨着只要是"0123456789abcef"这些字符都要进行转义,也就是属于十六进制范围内的字符。
其他编译器未进行测试,可以测试gcc/g++的编译情况。
可见是由于\xa7a超出了16进制的表示范围,那么如何解决呢,
string[] = {“”…"Bar\xc3\xa7""a TV"};
这样编译通过,看来C中和python对字符串处理在这里有一样的方式,对于接连的双引号都自动地将字符串连接,这在以往的编程经历中从来没有注意到这个问题。