判断 BOM,char[] 末尾到底要不要加 '

C++语言 码拜 9年前 (2015-10-08) 851次浏览

utf-8 的 BOM 是 0xEF 0xBB 0xBF

bool checkBOM(const string& text) {
    const char bom[] = {(char)0xEF, (char)0xBB, (char)0xBF, ""\0""};
    if (text.length() >= 3 && text.substr(0, 3) == bom) {
        return true;
    }
    return false;
}

这个里面的 bom[],我发现设置为 3 个元素也没有影响,那么 “”\0″” 这个到底有没有必要呢?

另外,如果不包含 “”\0″”  的话(也就是如下)
const char bom[] = {(char)0xEF, (char)0xBB, (char)0xBF};
我做了检查
sizeof(bom) = 3
strlen(bom) = 3
而且 bom[] 可以直接做为第一个参数传给 printf()
一切都说明 bom[] 不简单!它的第四个元素势必是 “”\0″”,但对他做 sizeof 操作为什么只返回 3 而不是 4 呢?
还有就是,好奇之下对 string(“abc”) 也做了 sizeof 运算,返回的结果是 24!
求高手指点,拜谢了!

方案推荐指数:5
用字符串相关函数的话,一定要加””\0″”,你自定义函数的话,只需要判断前3个字节就好,可以不加””\0″”结束符号。
方案推荐指数:10
要加””\0″”,不加也能printf是因为编译器帮你在对应的空间填了0,或者碰巧就是0
大部分stl实现都不会再构造string来比较。因为都会调用 char_traits<char>::compare 来比较字符串,这个函数接受const char*的参数。
方案推荐指数:15
bom[] = {(char)0xEF, (char)0xBB, (char)0xBF};
不是串 
能输出是凑巧,输出什么样子?
三个字符,sizeof 当然是3
至于 string 是一些 整型数和一个指针,sizeof 一个 string 对象 
可能是 16~32之间 或者 更多的
完全看编译器–类库–如何安排。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明判断 BOM,char[] 末尾到底要不要加 '
喜欢 (0)
[1034331897@qq.com]
分享 (0)