关于string的find()函数,你必须知道的一个坑
2015-03-09 17:46
260 查看
c++中的string,有一个方法是find(),每一个c++程序猿知道该函数的作用,但是,未必每一个c++程序猿都能正确的使用该函数
现在,你感觉到疑惑了,一个汉字两个字节,“東方红”用了6个字节,“|”的位置正好是6.怎么可能等于1呢!
问题就出在一个汉字占两个字节。”|“在ascii码表中的ascii值是124。而”東“这个字的第二个字节,恰好是124,因此,程序返回了1.
诸位看官,现在明白究竟是怎么一回事了吧,这种情况是很特殊的情况,平时很难遇到,笔者还遇到过更奇葩的情况,那个时候,为了检查字符串是否包含了不常用的字符而使用find()函数,待检查的字符都是双字节的,结果呢,源字符串的两个相邻汉字各取一个字节,恰好是一个待检查字符。就是从那个时候开始,我知道了这个坑,可以肯定,在所有介绍该函数的文章中,你很难看到这个坑,因为,它实在是太不明显了。
string str = "Welcome to China"; string str2 = "China"; int index = str.find(str2);执行上面的代码,index的值为11,现在,请看下面这段代码
string str = "東方红|太阳升"; string str2 = "|"; int index = str.find(str2);执行上面这段代码,index的值应该是多少呢? 如果你的答案是6,那么恭喜你,你答错了,真实的答案是1
现在,你感觉到疑惑了,一个汉字两个字节,“東方红”用了6个字节,“|”的位置正好是6.怎么可能等于1呢!
问题就出在一个汉字占两个字节。”|“在ascii码表中的ascii值是124。而”東“这个字的第二个字节,恰好是124,因此,程序返回了1.
诸位看官,现在明白究竟是怎么一回事了吧,这种情况是很特殊的情况,平时很难遇到,笔者还遇到过更奇葩的情况,那个时候,为了检查字符串是否包含了不常用的字符而使用find()函数,待检查的字符都是双字节的,结果呢,源字符串的两个相邻汉字各取一个字节,恰好是一个待检查字符。就是从那个时候开始,我知道了这个坑,可以肯定,在所有介绍该函数的文章中,你很难看到这个坑,因为,它实在是太不明显了。
相关文章推荐
- 关于String,你必须知道的东西!
- 关于多线程GCD,小白必须知道的常用函数
- C++ 标准模板库学习之 string 类 详解 (一) 将一个句子中每个单词的单词字母顺序翻转 关于npos find_first_not_of find_first_of getline
- 关于stl string find 容易犯的一个错误
- 一个关于模板字符串的使用技巧,以及 String.raw() 函数
- 关于iOS中的图片格式,一个合格的开发者必须知道的5个知识点
- 数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
- 在ASP.NET中,发现的关于string转换的一个小Bug
- 关于javascript中parseInt函数的一个所谓的bug
- 一个aspx页面有2个按钮,都是服务器控件,服务器上的DLL如何知道用户点击了哪个按钮,从而按钮的事件函数被调用
- [文摘20070914]一个成功的博客必须知道的80个博客工具
- 有关于 Longhorn Server Core 你必须知道的5件事情
- [初]一个C++关于string的小问题
- 作为一个程序员,有些知识你应该知道----关于并发和数据库封锁
- 关于使用Asp.net导出Excel,遭遇“LinkButton必须放在一个具有runat=server的标签的Form”的解决方案。
- 做一个中国式站长必须知道的五十个问题
- 关于hook设置函数如何支持多核CPU的一个说明
- 关于javascript中parseInt函数的一个所谓的bug
- [函数]function CheckUrl(url: string): Boolean; //检查一个URL是否有效函数
- [函数]function CheckUrl(url: string): Boolean; //检查一个URL是否有效函数