#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條經(jīng)驗 獲得超454個贊
哈哈,這個很有意思。因為我覺得也不應(yīng)該 find 到,所以我就在我這里試了下,果然沒找到!
可你卻找到了!那么我猜得這是編碼問題(因為我默認用的是 UTF-8 編碼),而且我猜你是在 Windows 系統(tǒng)下。我據(jù)此去查了下‘硚’的編碼,果然如此。這個結(jié)果非常有趣,我說一下:
Windows 使用的 ANSI 編碼會將一個漢字編碼為兩字節(jié)?!俺~”這個字的編碼是 b3 7e。“~”的編碼是 7e,恰好是硚編碼的第二個字節(jié)!
而 string 表示的是 char 字符串,也就是會把每個字符當作 char 來處理——即會按字節(jié)來處理,所以 find 按 char 來查找就找到了 7e!
一般來說,涉及漢字的編碼會比較復(fù)雜,在初學(xué)做字符串的實驗時不要用漢字!
P.S. 如果你一定要用漢字的話,就要用能夠處理“寬字符”的庫函數(shù)。std::wstring 是保存寬字符的字符串,在寫字符串字面量時在前面加上 L 表示其為寬字符串:
std::wstring?wchn?=?L"硚"; std::wstring?wtilde?=?L"~"; cout?<<?wchns.find(wtilde)?<<?endl;
這樣應(yīng)該就找不到了。 不過在初學(xué)時還是盡量避免用漢字吧!
- 1 回答
- 0 關(guān)注
- 1484 瀏覽
添加回答
舉報
0/150
提交
取消