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

這是BCB的BUG嗎???

答題得分者是:RaynorPao
moonrise
一般會員


發表:7
回覆:7
積分:2
註冊:2003-10-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-09 03:57:54 IP:61.229.xxx.xxx 未訂閱
下列的問題一直困擾我,雖然書本上說SetLength()可以設定字串的長度,不過大家可以把下段程式 跑一下就知道問題所在了,雖然有解決的方法(我註明ok的地方--原先字串超過SetLength設定的長度),不過總是不滿意,想請問大家,這這問題到底在那裡???  
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
        String s1,s2;
        s1="123";
        s2="456";
        s1=s1.SetLength(10);
        ShowMessage(s1 s2);//應該是123       456的,結果反而是123
        s1=123;
        s2=456;
        s1=(s1 "                 ").SetLength(10);  //ok
        ShowMessage(s1 s2);//這個就正確了    }
//----------------------------------------------------------------------
 
RaynorPao
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-09 08:31:02 IP:203.73.xxx.xxx 未訂閱
引言: 下列的問題一直困擾我,雖然書本上說SetLength()可以設定字串的長度,不過大家可以把下段程式 跑一下就知道問題所在了,雖然有解決的方法(我註明ok的地方--原先字串超過SetLength設定的長度),不過總是不滿意,想請問大家,這這問題到底在那裡???
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
        String s1,s2;
        s1="123";
        s2="456";
        s1=s1.SetLength(10);
        ShowMessage(s1 s2);//應該是123       456的,結果反而是123
        s1=123;
        s2=456;
        s1=(s1 "                 ").SetLength(10);  //ok
        ShowMessage(s1 s2);//這個就正確了    }
//----------------------------------------------------------------------
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-09 09:31:49 IP:61.229.xxx.xxx 未訂閱
RaynorPao 謝謝您的說明,按照您說的話,SetLength()是一個有問題的函數。 引述博碩文化出版"C Builder5徹底研究"說的一段話 "強制設定此字串的長度為newLength,如果newLength值比原字串長度長,那麼多出來的位置會被補上空白,如果比成先短,那麼多出的字串會被截掉。" 這一段是有疑問的…
系統時間:2024-05-18 17:10:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!