這是BCB的BUG嗎??? |
答題得分者是:RaynorPao
|
moonrise
一般會員 發表:7 回覆:7 積分:2 註冊:2003-10-05 發送簡訊給我 |
下列的問題一直困擾我,雖然書本上說SetLength()可以設定字串的長度,不過大家可以把下段程式
跑一下就知道問題所在了,雖然有解決的方法(我註明ok的地方--原先字串超過SetLength設定的長度),不過總是不滿意,想請問大家,這這問題到底在那裡???
//--------------------------------------------------------------------------- #include |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 下列的問題一直困擾我,雖然書本上說SetLength()可以設定字串的長度,不過大家可以把下段程式 跑一下就知道問題所在了,雖然有解決的方法(我註明ok的地方--原先字串超過SetLength設定的長度),不過總是不滿意,想請問大家,這這問題到底在那裡???//--------------------------------------------------------------------------- #include moonrise 你好: (1)先試試看加入以下標示為紅色的程式碼,並利用 UltraEdit (十六進位模式) 觀查兩個輸出的檔案內容 String s1,s2; s1="123"; s2="456"; s1=s1.SetLength(10); TMemoryStream *ms1=new TMemoryStream; ms1->Size=10; ms1->Write(&s1[1], 10); ms1->SaveToFile("1.dat"); delete ms1; ShowMessage(s1 s2);//應該是123 456的,結果反而是123 s1=123; s2=456; s1=(s1 " ").SetLength(10); //ok TMemoryStream *ms2=new TMemoryStream; ms2->Size=10; ms2->Write(&s1[1], 10); ms2->SaveToFile("2.dat"); delete ms2; ShowMessage(s1 s2);//這個就正確了 (2)因此,大概可以得到一個結論,原字串的實際長度小於你要給它設定的長度 的話,它後來多出來的記憶體,是不會自動填入空白的 (0x20),因此你在做 ShowMessage(s1 s2); 的時候,一遇到原來 s1 的 0x00 就被截斷了;另外 ,若原字串的實際長度大於你要給它設定的長度的話,這個當然就沒有問題 ,因為你原本就補了空白 (0x20),因此不會有遇到 0x00 被截斷的問題,所 以 ShowMessage(s1 s2); 自然也就正確了 >> --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
moonrise
一般會員 發表:7 回覆:7 積分:2 註冊:2003-10-05 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |