線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2032
推到 Plurk!
推到 Facebook!

請教AnsiString如何取得特定字串的位址(字串有重複)

尚未結案
logi
一般會員


發表:4
回覆:4
積分:1
註冊:2002-10-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-18 10:50:43 IP:220.142.xxx.xxx 未訂閱
假設 AnsiString rect="111112222233333aaabbbccc333332222211111cccbbbaaa"; 要取的"33333"所有位置 rect.pos("33333"); ==> 第一個位址 那第二個要如何去取得... 方法一: 前面的字串拿掉在再取一次位址. (有沒有比較快速的方式)
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-18 11:14:13 IP:203.73.xxx.xxx 未訂閱
引言: 假設 AnsiString rect="111112222233333aaabbbccc333332222211111cccbbbaaa"; 要取的"33333"所有位置 rect.pos("33333"); ==> 第一個位址 那第二個要如何去取得... 方法一: 前面的字串拿掉在再取一次位址. (有沒有比較快速的方式)
logi 你好:
(1)也許可以自己寫一個迴圈,就可以找到每個子字串的正確位置,例如:
   AnsiString szSrc="111112222233333aaabbbccc333332222211111cccbbbaaa";
   AnsiString szDst="33333";
   for(int i=0; iLines->Add(IntToStr(i+1));
      }
   }
(2)如果你真正的目的是想置換字串之中某個子字串的話,可以直接利用 BCB 提
   供的 function StringReplace 來達到目的,例如: 假設你想置換原字串中
   所有的 "33333" 為 "444" 的話,只需要醬子寫就可以了
   AnsiString szSrc="111112222233333aaabbbccc333332222211111cccbbbaaa";
   AnsiString szDst="33333";
   AnsiString szDst1="444";
   AnsiString szSrc1=StringReplace(szSrc, szDst, szDst1, TReplaceFlags()<
(3)或者,用你自己想到的方法,也可以找到答案
   AnsiString szSrc="111112222233333aaabbbccc333332222211111cccbbbaaa";
   AnsiString szDst="33333";
   int iFind=0;
   AnsiString szTmp=szSrc;
   while(szTmp.AnsiPos(szDst))
   {
      Memo1->Lines->Add(IntToStr(szTmp.AnsiPos(szDst)+iFind*szDst.Length()));
      szTmp=StringReplace(szTmp, szDst, "", TReplaceFlags()>>rfReplaceAll);
      iFind++;
   }
(4)請再依照自己的需求,自行修改
    < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=10003806&CC=223734"> -- Enjoy Researching & Developing --    發表人 - RaynorPao 於 2004/08/18  11:26:50
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-18 11:15:19 IP:219.132.xxx.xxx 未訂閱
logi:
提供一個副程式供參考
AnsiString rect="111112222233333aaabbbccc333332222211111cccbbbaaa";    AnsiString Snum=Count_Str_Num(rect,"33333","-"); //傳回11,25,    AnsiString __fastcall Form1::Count_Str_Num(AnsiString Str,AnsiString StrPos,AnsiString ReplPos)
{
  AnsiString S=Str;
  AnsiString S1="";  // 計數返回值為出現位址
  int pos1 = -1;  
  do {
    pos1 = S.Pos(StrPos); 
    if (pos1 > 0)        {
      S1 =IntToStr(pos1) ",";
      S.Delete(pos1, 1); // 刪除一個字元即可
      S.Insert(ReplPos, pos1); // 同位址置換另一個字元
    }
  } while (pos1 !=0 );
  return S1;
}
此方式為找到後僅取代一個字元,再繼續找相信比你要處理前面的字串拿掉在再取一次位址應該要快及方便一些。
請參考
Andy Chang 發表人 - andychang1690 於 2004/08/18 11:17:05 發表人 - andychang1690 於 2004/08/18 11:26:21
------
Andy Chang
logi
一般會員


發表:4
回覆:4
積分:1
註冊:2002-10-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-26 20:35:24 IP:220.142.xxx.xxx 未訂閱
thanks for your support
系統時間:2024-06-22 18:50:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!