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

AnsiString.Pos() 的問題

尚未結案
Wuei
一般會員


發表:10
回覆:11
積分:4
註冊:2003-08-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-08 14:58:23 IP:210.192.xxx.xxx 未訂閱
您好: 我有一個很長的字串,裡面有很多子字串,中間有空白間隔,例如 String MyString = "ABCDE ABCD ABC"; 我想找出子字串 MySubString 在 MyString 中的位置 令 MySubString = "ABCD"; 我試過: MyPosition = MyString.Pos(MySubString); MyPosition = MyString.Pos((" " MySubString " ").c_str()); 結果都會傳回1,似乎因為"ABCD"跟"ABCDE"重複,第二行加了空白還是一樣 若是: MyPosition = MyString.Pos(" " MySubString " "); 則會傳回0,根本找不到 請問該怎麼寫才對呢? 多謝了!
RaynorPao
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-08 15:09:57 IP:203.73.xxx.xxx 未訂閱
引言: 您好: 我有一個很長的字串,裡面有很多子字串,中間有空白間隔,例如 String MyString = "ABCDE ABCD ABC"; 我想找出子字串 MySubString 在 MyString 中的位置 令 MySubString = "ABCD"; 我試過: MyPosition = MyString.Pos(MySubString); MyPosition = MyString.Pos((" " MySubString " ").c_str()); 結果都會傳回1,似乎因為"ABCD"跟"ABCDE"重複,第二行加了空白還是一樣 若是: MyPosition = MyString.Pos(" " MySubString " "); 則會傳回0,根本找不到 請問該怎麼寫才對呢? 多謝了!
Wuei 你好: 請參考以下的做法 < class="code"> AnsiString szSrc="ABCDE ABCD ABC"; AnsiString szDst="ABCD"; int i=szSrc.AnsiPos(" " szDst " "); ShowMessage(i); -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
Wuei
一般會員


發表:10
回覆:11
積分:4
註冊:2003-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-08 15:36:43 IP:210.192.xxx.xxx 未訂閱
引言: Wuei 你好: 請參考以下的做法 < class="code"> AnsiString szSrc="ABCDE ABCD ABC"; AnsiString szDst="ABCD"; int i=szSrc.AnsiPos(" " szDst " "); ShowMessage(i); -- Enjoy Researching & Developing --
您好 宣告AnsiString和宣告String是不是一樣? 我試著將我程式中的Pos()改成AnsiPos() 結果還是一樣,回傳是前面有重複子字串的位置耶 謝謝

中階會員


發表:36
回覆:142
積分:70
註冊:2003-07-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-08 15:58:55 IP:163.23.xxx.xxx 未訂閱
Wuei 您好: MyPosition = MyString.Pos((" " MySubString " ").c_str()); 您的 MyPosition 要宣告為 int 型態才會對喔
Wuei
一般會員


發表:10
回覆:11
積分:4
註冊:2003-08-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-08 16:39:49 IP:210.192.xxx.xxx 未訂閱
引言: Wuei 您好: MyPosition = MyString.Pos((" " MySubString " ").c_str()); 您的 MyPosition 要宣告為 int 型態才會對喔
是 int 型態沒錯 ....
RaynorPao
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-08 17:54:46 IP:203.73.xxx.xxx 未訂閱
引言: 您好 宣告AnsiString和宣告String是不是一樣? 我試著將我程式中的Pos()改成AnsiPos() 結果還是一樣,回傳是前面有重複子字串的位置耶 謝謝
Wuei 你好: 你有完全照我的寫法嗎?? 建議你再檢查看看 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
Wuei
一般會員


發表:10
回覆:11
積分:4
註冊:2003-08-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-09 10:50:15 IP:210.192.xxx.xxx 未訂閱
引言: Wuei 你好: 你有完全照我的寫法嗎?? 建議你再檢查看看 -- >< face="Verdana, Arial, Helvetica"> 真的不行呀 我的程式是這樣: AnsiString NetString,StringBuffer; if( NetString.AnsiPos(" " StringBuffer " ") == 0 ) XXXXX; 所有的 String 宣告都改成 AnsiString 了 Pos() 也改成 AnsiPos() 了 但是在尋找(" " StringBuffer " ")時還是無法避免找到包含 "StringBuffer" 的字串 覺得字串處理真是很傷腦筋,能再幫我想想看嗎? 謝謝了!
RaynorPao
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-09 11:09:25 IP:203.73.xxx.xxx 未訂閱
引言: 真的不行呀 我的程式是這樣: AnsiString NetString,StringBuffer; if( NetString.AnsiPos(" " StringBuffer " ") == 0 ) XXXXX; 所有的 String 宣告都改成 AnsiString 了 Pos() 也改成 AnsiPos() 了 但是在尋找(" " StringBuffer " ")時還是無法避免找到包含 "StringBuffer" 的字串 覺得字串處理真是很傷腦筋,能再幫我想想看嗎? 謝謝了!
Wuei 你好: 麻煩你請提供完整的程式碼 (包括字串的內容),一直說不行,卻又不肯把程式 碼貼上來,猜謎遊戲真的那麼好玩嗎?? 有助於解決你的問題嗎??< >< > -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-09 11:46:40 IP:211.72.xxx.xxx 未訂閱
引言: 您好: 我有一個很長的字串,裡面有很多子字串,中間有空白間隔,例如 String MyString = "ABCDE ABCD ABC"; 我想找出子字串 MySubString 在 MyString 中的位置 令 MySubString = "ABCD"; 我試過: MyPosition = MyString.Pos(MySubString); MyPosition = MyString.Pos((" " MySubString " ").c_str()); 結果都會傳回1,似乎因為"ABCD"跟"ABCDE"重複,第二行加了空白還是一樣 若是: MyPosition = MyString.Pos(" " MySubString " "); 則會傳回0,根本找不到
呵呵~~請注意大小寫的問題,POS是分大小寫的喔 建議你,先把兩個字串都轉換成大寫,再來做搜尋的動作喔,如下 String MyString = "ABCDE ABCD ABC"; String ss,s1; ss = MyString.UpperCase(); s1 = " ABCD "; int MyPosition = ss.Pos(s1);
Wuei
一般會員


發表:10
回覆:11
積分:4
註冊:2003-08-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-12-09 11:56:57 IP:210.192.xxx.xxx 未訂閱
引言: Wuei 你好: 麻煩你請提供完整的程式碼 (包括字串的內容),一直說不行,卻又不肯把程式 碼貼上來,猜謎遊戲真的那麼好玩嗎?? 有助於解決你的問題嗎??< >< > -- Enjoy Researching & Developing --
因為程式碼很長啊!而且大部分的程式都跟這個問題沒關係 我就是卡在這一行,確定是這一行有問題 因為不常在這裡逛,不太清楚怎麼問比較有效率 冒犯的地方請多見諒 我所要處理的是OrCAD所轉出來的Netlist(*.asc) 程式是將檔案中的Net名稱和Nets擷取出來 擷取出來的字串會像是這個樣子: N1029584 U141.E11 RJ132.2 N19531391 U111.B5 RJ111.1 N1030008 RJ131.2 U141.A12 ADD7 U141.E1 U111.D3 .... 其中沒有"."的是Net名稱,有"."的就是Net 在擷取的過程中,會遇到兩個Net無法區別的情形,比方說如果已經有了"U141.E11"這個Net,那麼再遇到"U141.E1"這個Net程式就會以為已經有了,因而漏掉了這個Net(判斷式就是我問的那一行) 不知道這樣說對解決問題有沒有幫助,接著貼上我的程式碼(刪減了一些無關緊要的部分): --------------------------------------------------------------- //--------------------------------------------------------------------------- // Function ScanNet(FILE *netfile_p) // scan and return NetNames and Nets in a file, omit all other strings //--------------------------------------------------------------------------- AnsiString ScanNet(FILE *netfile_p) { int i; int NetNamePos = 1; int ScanFlag = 0; AnsiString StringBuffer=" "; // 15 characters AnsiString NetString=""; AnsiString CurrentNetName=" "; // 15 characters while(!feof(netfile_p)) { fscanf(netfile_p,"s",StringBuffer); switch(ScanFlag) { case 1: // add NetName // check if the NetName is already added, then add NetName if(strcmp(CurrentNetName.c_str(),StringBuffer.c_str()) != 0) { NetNamePos = NetString.Length() 1; strcpy(CurrentNetName.c_str(),StringBuffer.c_str()); NetString = NetString CurrentNetName.c_str() " "; } ScanFlag = 2; break; case 2: // add Nets if(StringBuffer.AnsiPos(".")!=0) { // extract current NetName and Nets than check if the Net has been added if( NetString.SubString(NetNamePos,NetString.Length()).AnsiPos(" " StringBuffer " ") == 0 ) NetString = NetString StringBuffer.c_str() " "; } else if(StringBuffer.AnsiPos("*SIGNAL*")!=0) ScanFlag = 1; // go on next NetName else ScanFlag = 2; // Nither a NetName or a Net, skip break; } } return NetString; } 再次感謝!
RaynorPao
版主


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-12-09 13:36:29 IP:203.73.xxx.xxx 未訂閱
引言: 因為程式碼很長啊!而且大部分的程式都跟這個問題沒關係 我就是卡在這一行,確定是這一行有問題 因為不常在這裡逛,不太清楚怎麼問比較有效率 冒犯的地方請多見諒 我所要處理的是OrCAD所轉出來的Netlist(*.asc) 程式是將檔案中的Net名稱和Nets擷取出來 擷取出來的字串會像是這個樣子: N1029584 U141.E11 RJ132.2 N19531391 U111.B5 RJ111.1 N1030008 RJ131.2 U141.A12 ADD7 U141.E1 U111.D3 .... 其中沒有"."的是Net名稱,有"."的就是Net 在擷取的過程中,會遇到兩個Net無法區別的情形,比方說如果已經有了"U141.E11"這個Net,那麼再遇到"U141.E1"這個Net程式就會以為已經有了,因而漏掉了這個Net(判斷式就是我問的那一行) 不知道這樣說對解決問題有沒有幫助,接著貼上我的程式碼(刪減了一些無關緊要的部分): --------------------------------------------------------------- //--------------------------------------------------------------------------- // Function ScanNet(FILE *netfile_p) // scan and return NetNames and Nets in a file, omit all other strings //--------------------------------------------------------------------------- AnsiString ScanNet(FILE *netfile_p) { int i; int NetNamePos = 1; int ScanFlag = 0; AnsiString StringBuffer=" "; // 15 characters AnsiString NetString=""; AnsiString CurrentNetName=" "; // 15 characters while(!feof(netfile_p)) { fscanf(netfile_p,"s",StringBuffer); switch(ScanFlag) { case 1: // add NetName // check if the NetName is already added, then add NetName if(strcmp(CurrentNetName.c_str(),StringBuffer.c_str()) != 0) { NetNamePos = NetString.Length() 1; strcpy(CurrentNetName.c_str(),StringBuffer.c_str()); NetString = NetString CurrentNetName.c_str() " "; } ScanFlag = 2; break; case 2: // add Nets if(StringBuffer.AnsiPos(".")!=0) { // extract current NetName and Nets than check if the Net has been added if( NetString.SubString(NetNamePos,NetString.Length()).AnsiPos(" " StringBuffer " ") == 0 ) NetString = NetString StringBuffer.c_str() " "; } else if(StringBuffer.AnsiPos("*SIGNAL*")!=0) ScanFlag = 1; // go on next NetName else ScanFlag = 2; // Nither a NetName or a Net, skip break; } } return NetString; } 再次感謝!
Wuei 你好: 不好意思,老實說~~我還是不太明白你真正的目的,我在此假設你的目的是想要 得到所有含有 "." 的字串,請參考以下的範例程式碼 (請再依照自己的需求做 必要的修改) < class="code"> AnsiString szSrc="N1029584 U141.E11 RJ132.2 N19531391 U111.B5 RJ111.1 N1030008 RJ131.2 U141.A12 ADD7 U141.E1 U111.D3"; AnsiString szDst=StringReplace(szSrc, " ", ",", TReplaceFlags()<CommaText=szDst; for(int i=0; iCount; i ) { if(sl1->Strings[i].AnsiPos(".")>0) { sl2->Add(sl1->Strings[i]); } } sl2->SaveToFile("test.dat"); delete sl2; delete sl1; -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-12-09 13:42:37 IP:140.135.xxx.xxx 未訂閱
Wuei您好:  
引言: 因為程式碼很長啊!而且大部分的程式都跟這個問題沒關係 我就是卡在這一行,確定是這一行有問題 因為不常在這裡逛,不太清楚怎麼問比較有效率 冒犯的地方請多見諒
因為您的原題目與真實問題是不相同的,而RaynorPao版主熱心的解決您的原問題 您卻一直說不行,所以當然覺得很納悶,您應該主動提供更多的資源來讓大家幫您看看,這樣才是[討論區],而不是[猜謎區] 順心
系統時間:2024-05-18 16:55:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!