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

AnsiString 陣列大小

尚未結案
l8939_c
一般會員


發表:9
回覆:15
積分:4
註冊:2005-03-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-04 17:04:43 IP:61.220.xxx.xxx 未訂閱
請問: 我寫了一個處理字串的函數 它處理完後, 會回傳一個 AnsiString 的陣列 程式一切正常, 但我接收了這個 AnsiString 的陣列後 要如何才能知道此陣列的大小呢 例如: string a1[]={"1234","abcdefg","111111111"}; 我要如何得知 a1陣列是由 a1[0] ~ a1[2] 呢 engineer
------
engineer
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-04 18:14:42 IP:61.70.xxx.xxx 未訂閱
您好: 基本上無法直接得到他有幾個AnsiString,我的做法都是多一個元素加上結尾識別,如下面加上"-1",在用迴圈去跑來得到他有幾個元素,就好像在C裡面字元陣列結尾會有一個"\0"的意思一樣. string a1[]={"1234","abcdefg","111111111","-1"};
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-04 21:03:52 IP:211.76.xxx.xxx 未訂閱
l8939_c 您好:    插個花!    關於這個問題,個人有兩個建議,請參考: 1.利用sizeof(.)來計算,當然前提:是陣列定義與計算在同一函式中。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString a1[]={"1234","abcdefg","111111111"};
  ShowMessage( sizeof(a1)/sizeof(a1[0]) );
}
2.可不可以將結果存成 TStringList 的形式再傳回,這樣就能得到相關的長度等資訊。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
l8939_c
一般會員


發表:9
回覆:15
積分:4
註冊:2005-03-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-05 08:53:24 IP:61.220.xxx.xxx 未訂閱
感謝 supman兄 與 richtop兄的發言! supman 您的建議的確可行, 不過使用上有點麻煩, 我希望讓程式越簡潔越好 但若找不到更好的方法時, 您的方法似乎是唯一解決之道 richtop 您第一個建議, 我試過了, 由於是函數間的呼叫, 所以是以指標宣告 例: String *test_str() , 所以 sizeof(a1)/sizeof(a1[0]) = 1 , 無法滿足需求 你第二個建議提到 TStringList , 不好意思, 我沒用過, 不知這是什麼呢 ? 使用上麻不麻煩呢, 我希望我寫的函數, 別人也可以很容易使用, 所以希望 盡量簡單一點 記得以前用 VB 時, 只要使用 UBOUND() 函數, 就可得到陣列上限值 真搞不懂 C 為何這麼不方便呢 希望還有人可以幫我再提點意見..... engineer
------
engineer
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-05 10:38:54 IP:211.76.xxx.xxx 未訂閱
l8939_c 您好:    其實我原本的目的是:覺得TStringList值得學習,所以提出供您參考! 底下有個簡單示範,請參考! 如果要做文字資料的處理與檔案存取,我是建議使用TStringList(under BCB)! 詳細的細節,請參考線上說明,或許真能發現使用它的好處。 < class="code"> //--------------------------------------------------------------------------- TStringList * getStrings() { int len; TStringList *lst = new TStringList(); AnsiString a1[]={"1234","abcdefg","111111111"}; len = sizeof(a1) / sizeof(a1[0]); for (int k=0; kAdd(a1[k]); } return (lst); } void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString msg; TStringList *lst; lst = getStrings(); ShowMessage( lst->Count ); //==== 顯示傳回的資料 for (int k=0; kCount; k ) msg.cat_printf("%s\n", lst->Strings[k]); ShowMessage(msg); delete lst; lst = NULL; } //--------------------------------------------------------------------------- RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-05 11:07:03 IP:203.204.xxx.xxx 未訂閱
您好: 如果您使用AnsiString的話,最後添加結尾元素應該是唯一解,以前看書上也都只有使用這各方法,您沒看到連編譯器都必須再結尾元素填上 \0 ,不然他無法知道長度為多少. C的特性就是這樣,記憶體比較活用,但卻也比較危險及麻煩,像Delphi也是用Length就能得到陣列的元素個數. 至於richtop大大所提的TStringList的話就好用多了,看您的需求. 您也可以動態配置AnsiString,自己去new他,當然也會知道他有幾各. 您在以下這篇已經有問到,如何動態配置了,不多寫. http://delphi.ktop.com.tw/topic.php?topic_id=70048 TStringList就類似一串的AnsiString的物件,您每Add一次他會自動幫您配置一各AnsiString. void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList *List; List= new TStringList; List->Add("aaa");//增加元素 List->Add("bbb"); List->Add("ccc"); ShowMessage(IntToStr(List->Count));//得到有幾各元素 ShowMessage(List->Strings[0]);得到第一各aaa的字串 List->Free(); } 發表人 - supman 於 2005/05/05 11:18:39
l8939_c
一般會員


發表:9
回覆:15
積分:4
註冊:2005-03-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-05 12:02:03 IP:61.220.xxx.xxx 未訂閱
感謝 supman,richtop 兩位大大的建議 經兩位說明, 我覺得 TStringList 用法是還蠻簡單的,不過看來 TStringList 好像就只比 String 多了->Count 的功能吧, 由於我還要對字串作一些處理 所以我還是比較習慣用 String 那我還是決定使用 supman 的建議, 不過不是在結尾加上識別符號 因為這還要用回圈才能判斷出陣列的上限值, 太麻煩了 我要將陣列大小值, 存入第0 陣列中 例如 : a[0]="15" a[1]="ssss" a[2]="ssss2" ....... a[15]="jkjkl" 實際陣列為 a[1]~a[15] , a[0] 用來存放陣列大小值 如此可免用迴圈的部分 下次有機會, 我會用 TStringList 來試試 感謝兩位的幫忙 ~ engineer
------
engineer
系統時間:2024-11-27 10:45:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!