全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3011
推到 Plurk!
推到 Facebook!

中英混雜的字串處理函式

 
s1937kk
一般會員


發表:2
回覆:15
積分:8
註冊:2004-11-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-22 20:06:29 IP:220.140.xxx.xxx 未訂閱
大家好,小弟是C / C++的新手 中英混雜的字串是相當常見的 而BCB內建的字串處理函式「好像」沒有可用的函數 所以小弟寫了三個最常用的「中英混雜字串處理函式」 當作是練習吧~    由於小弟剛學C / C++,用的工具是BCB 對於C++及BCB工具的特性、語法架構不是很熟悉 所以寫的不好的地方請高手指點 如果寫的還可以勉強使用的話,大家就將就用吧@@ 以後希望大家多多指教,謝謝^^    函式名稱:Mid 說明:抓取字串 Mid("字串",開始位置,字數)    函式名稱:InStr 說明:尋找字串 iPos = InStr("被搜尋的字串","搜尋的字串"[,開始位置,是否區分大小寫]);    函式名稱:Len 說明:計算字串長度 iLen = Len("字串");    PS.函式名稱是模仿VB的函式名稱,用過VB的人應該蠻習慣的吧    使用範例:
AnsiString str;
int iPos=0,iLen=0;
str = Mid("a中b文c字",3,2);
//str = b文
iPos = InStr("a中b文c字","b文");
//iPos = 3
iPos = InStr("A中B文C字","b文",1,false);
//iPos = 3
iLen = Len("a中b文c字");
//iLen = 6    //函式宣告-------------------------------------------------------------------
AnsiString Mid(AnsiString S1,int iStart,int iCount);
int InStr(AnsiString S1,AnsiString strSub,int iStart = 1,bool bolCparCase = true);
int Len(AnsiString sText);
//---------------------------------------------------------------------------
AnsiString Mid(AnsiString S1,int iStart,int iCount)
{
    int iLen = S1.Length();
    int iGrabCount=0,iRealCount=0,iRealStart=0,i;
    int iWordCount=0;
    short shAscii;
    char *ch;
    AnsiString strTemp;        if(iStart == 0) iStart=1;        for(i=1;i<=iLen;i  )
    {
        strTemp = S1.SubString(i,1);
        ch = strTemp.c_str();
        shAscii = short(ch[0]);            iWordCount  ;            if(iWordCount == iStart)iRealStart = i;            if(shAscii < 0 )
        {
            if(iRealStart != 0)
            {
                iRealCount = iRealCount   2;
                iGrabCount  ;
            }
            i  ;
        }
        else
        {
            if(iRealStart != 0)
            {
                iRealCount  ;
                iGrabCount  ;
            }
        }
        if(iGrabCount >= iCount) break;
    }
    return S1.SubString(iRealStart,iRealCount);
}
//---------------------------------------------------------------------------
int InStr(AnsiString S1,AnsiString strSub,int iStart,bool bolCparCase)
{      
    int i,j;
    AnsiString cS1,cSub;
    int iPos=0;
    bool bolIsMatch=true;
    char *ch;        if (iStart == 0)
    {
        iStart = 1;
    }
    else if(iStart > S1.Length())
    {
        iStart = S1.Length();
    }        if (bolCparCase == false)
    {
        S1 = AnsiUpperCase(S1);
        strSub = AnsiUpperCase(strSub);
    }        cSub = strSub.SubString(1,1);
    
    for(i=1;i<=S1.Length();i  )
    {
        if (iPos >= iStart)
        {
            cS1 = S1.SubString(i,1);                if (cS1 == cSub)
            {
                bolIsMatch = true;                    for(j=0;j     
        
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-23 08:30:32 IP:61.66.xxx.xxx 未訂閱
函式名稱:Mid 說明:抓取字串 Mid("字串",開始位置,字數) BCB有SubString可用 函式名稱:InStr 說明:尋找字串 iPos = InStr("被搜尋的字串","搜尋的字串"[,開始位置,是否區分大小寫]); BCB有Pos可用 函式名稱:Len 說明:計算字串長度 iLen = Len("字串"); BCB有Length可用 用法 你的string必須用BCB的AnsiString宣告 例AnsiString AAA = "BBB"; 你就可以使用AAA.SubString等功能了 詳細用法可以再網站搜尋或查help 不過,這跟中英文夾雜好像沒什麼關係
s1937kk
一般會員


發表:2
回覆:15
積分:8
註冊:2004-11-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-23 14:55:05 IP:220.140.xxx.xxx 未訂閱
你好,我想可能是我沒表達清楚吧 你說的AnsiString我當然知道... 如果你有看我的函數內容的話... 但 str = "a中b文c">Text = ""; //亂碼,因為是從第2個位元組開始抓取1個位元組 Memo1->Lines->Add(str.SubString(2,1)); //中,從第2個字抓取1個字,中文字2byte算一個字 Memo1->Lines->Add(Mid(str,2,1)); //4,b在第4個字元 Memo1->Lines->Add(str.Pos("b")); //3,b在3個字,中文字2byte算一個字 Memo1->Lines->Add(InStr(str,"b")); //長度為7個字元 Memo1->Lines->Add(str.Length()); //長度為5個字,中文字2byte算一個字 Memo1->Lines->Add(Len(str));
fusung
中階會員


發表:26
回覆:169
積分:99
註冊:2003-11-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-23 23:47:44 IP:211.23.xxx.xxx 未訂閱
哈囉,s1937kk    今天剛好用了你的函式解決了一個問題,感覺真好 < href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=73817">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=73817 ~多謝囉~ /* The first step toward proving things for yourself is to understand how others have done it before! */
------


The first step toward proving things for yourself is to understand how others have done it before!

s1937kk
一般會員


發表:2
回覆:15
積分:8
註冊:2004-11-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-24 00:38:48 IP:220.140.xxx.xxx 未訂閱
嗨!fusung 你好 很高興能對你有幫助 以後還請多多指教,謝謝
zhvickie
一般會員


發表:16
回覆:41
積分:11
註冊:2003-05-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-24 21:41:00 IP:137.132.xxx.xxx 未訂閱
好啊。 太好了,一直还搞不定。 终于有这个了
s1937kk
一般會員


發表:2
回覆:15
積分:8
註冊:2004-11-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-24 22:52:47 IP:61.219.xxx.xxx 未訂閱
我剛剛修改了一下函式的內容 修正後執行效率變比較快一些 時間數據是測試 class="code"> AnsiString str ="a中b英c文d夾e雜f字g串h",strTemp; int i; for(i=0;i<100000;i ) { strTemp = Mid(str,14,2); } 修正前時間:1.443799996 修正後時間:0.136000001 ------------------------------------------------ 「InStr」
AnsiString str ="a中b英c文d夾e雜f字g串h";
int i,a;
for(i=0;i<100000;i  )
{
    a = InStr(str,"h");
}
修正前時間:2.81880002 修正後時間:0.115599999 ------------------------------------------------
「Len」
AnsiString str ="a中b英c文d夾e雜f字g串h";
int i,a;
for(i=0;i<100000;i  )
{
    a = Len(str);
}
修正前時間:1.517400014 修正後時間:0.0328
zhvickie
一般會員


發表:16
回覆:41
積分:11
註冊:2003-05-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-25 16:23:48 IP:137.132.xxx.xxx 未訂閱
好像还有问题,对于含有符号的结果有问题 str="由於小弟剛學C / C ,用的工具是BCB"; Caption=Mid(str,0,7); 结果是“由於小弟剛學C”
s1937kk
一般會員


發表:2
回覆:15
積分:8
註冊:2004-11-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-27 09:10:07 IP:61.219.xxx.xxx 未訂閱
引言: 好像?有??,?于含有符?的?果有?? str="由於小弟剛學C / C ,用的工具是BCB"; Caption=Mid(str,0,7); ?果是“由於小弟剛學C”
你好,在Mid函數中有一行是當第一個參數iStart等於0時 將其改為1,用意是不讓函數發生錯誤 if(iStart == 0) iStart=1; 因此Caption=Mid(str,0,7); 有就等於Caption=Mid(str,1,7); 所以結果是正確的
jackyung
一般會員


發表:22
回覆:46
積分:13
註冊:2004-01-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-28 03:52:59 IP:218.171.xxx.xxx 未訂閱
我通常都轉為 Unicode 碼來處理 MutiByte 字碼(比如 BIG5)有提供一個 mblen() 函數來判斷字碼可以利用 關於這方面的問題三言兩語也說不清 請參考 http://xcin.linux.org.tw/i18n/pc2000/p3/index.html
s1937kk
一般會員


發表:2
回覆:15
積分:8
註冊:2004-11-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-29 14:28:14 IP:61.219.xxx.xxx 未訂閱
引言: 我通常都轉為 Unicode 碼來處理 MutiByte 字碼(比如 BIG5)有提供一個 mblen() 函數來判斷字碼可以利用 關於這方面的問題三言兩語也說不清 請參考 http://xcin.linux.org.tw/i18n/pc2000/p3/index.html
原來早就有處理雙byte問題的標準函式可用了啊< > 謝謝囉~小弟還要再研究看看< >
系統時間:2024-09-06 13:25:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!