#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 回答
- 0 关注
- 1446 浏览
添加回答
举报
0/150
提交
取消