为了账号安全,请及时绑定邮箱和手机立即绑定

c++ string strInfo="硚"; 不包含 字符 ~,使用find也返回1

c++ string strInfo="硚"; 不包含 字符 ~,使用find也返回1

C++
颍川道人 2017-06-12 14:21:29
#include <iostream> #include <string> using namespace std; inline string&   replace_all(string&   str, const   string&   old_value, const   string&   new_value) { while (true) { string::size_type   pos(0); pos = str.find(old_value); //cout <<pos<< endl; if ( (pos = str.find(old_value)) != string::npos   ) str.replace(pos, old_value.length(), new_value); else break; } return   str; } int main() { string strInfo="硚"; string::size_type   pos(0); string strInfo1="~"; pos =strInfo.find(strInfo1); cout <<pos<< endl;  strInfo = replace_all(strInfo, "~", "#$");// cout <<strInfo<< endl; // prints !!!Hello World!!! }烦请大神解答下,string strInfo="硚"; 不包含 字符 ~,使用find也返回1
查看完整描述

1 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

哈哈,这个很有意思。因为我觉得也不应该 find 到,所以我就在我这里试了下,果然没找到!


可你却找到了!那么我猜得这是编码问题(因为我默认用的是 UTF-8 编码),而且我猜你是在 Windows 系统下。我据此去查了下‘硚’的编码,果然如此。这个结果非常有趣,我说一下:

Windows 使用的 ANSI 编码会将一个汉字编码为两字节。“硚”这个字的编码是 b3 7e。“~”的编码是 7e,恰好是硚编码的第二个字节!

而 string 表示的是 char 字符串,也就是会把每个字符当作 char 来处理——即会按字节来处理,所以 find 按 char 来查找就找到了 7e!


一般来说,涉及汉字的编码会比较复杂,在初学做字符串的实验时不要用汉字!


P.S. 如果你一定要用汉字的话,就要用能够处理“宽字符”的库函数。std::wstring 是保存宽字符的字符串,在写字符串字面量时在前面加上 L 表示其为宽字符串:

std::wstring wchn = L"硚";
std::wstring wtilde = L"~";
cout << wchns.find(wtilde) << endl;

这样应该就找不到了。 不过在初学时还是尽量避免用汉字吧!


查看完整回答
1 反对 回复 2017-06-13
  • 1 回答
  • 0 关注
  • 1446 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信