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*的参数。
大部分stl实现都不会再构造string来比较。因为都会调用 char_traits<char>::compare 来比较字符串,这个函数接受const char*的参数。
方案推荐指数:15
bom[] = {(char)0xEF, (char)0xBB, (char)0xBF};
不是串
能输出是凑巧,输出什么样子?
三个字符,sizeof 当然是3
至于 string 是一些 整型数和一个指针,sizeof 一个 string 对象
可能是 16~32之间 或者 更多的
完全看编译器–类库–如何安排。
不是串
能输出是凑巧,输出什么样子?
三个字符,sizeof 当然是3
至于 string 是一些 整型数和一个指针,sizeof 一个 string 对象
可能是 16~32之间 或者 更多的
完全看编译器–类库–如何安排。