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

一個關於 ANSI String 的問題

答題得分者是:RaynorPao
Eigen
初階會員


發表:19
回覆:36
積分:26
註冊:2002-12-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-12 14:59:45 IP:61.218.xxx.xxx 未訂閱
一個關於 ANSI String 的問題    請大家幫我解釋一下,這樣的兩種表示方示有什麼不一樣?            String ss1=s1;         String ss2=s2;            String ss1=(char *)s1.c_str();         String ss2=(char *)s2.c_str();    我在 Form1 宣告了兩個 public 的String s1,s2;    然後將兩個全域變數array a[] b[] 的值給 s1 s2    我測式一個簡單的程式    宣告兩個 String  ss1,ss2 ,然後將 s1的值給 ss1 ,s2 的值給ss1,接著修改 ss1,ss2    結果 s1 s2 的內容也跟著被修改了?_?    為什麼           String ss1=s1;         String ss2=s2; 這樣的表示方式  會讓 ss1 和 s1 指向同一個memory    而                 String ss1=(char *)s1.c_str();         String ss2=(char *)s2.c_str(); 這樣的表示方式就不會。                          //--------------------------------------------------------------------------- void ana_string(char *str,int str_len); char a[]="this is a simple test"; char b[]="abcd12345"; #include  #pragma hdrstop #include "test.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { s1=(char *)a; s2=(char *)b; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { String ss1=s1; String ss2=s2; ss1=s1; ss2=s2; Label1->Caption="s1= " s1; Label2->Caption="s2= " s2; Label3->Caption="ss1= " ss1; Label4->Caption="ss2= " ss2; ana_string(ss1.c_str(),ss1.Length()); ana_string(ss2.c_str(),ss2.Length()); Label5->Caption="s1= " s1; Label6->Caption="s2= " s2; Label7->Caption="ss1= " ss1; Label8->Caption="ss2= " ss2; } //--------------------------------------------------------------------------- void ana_string(char *str,int str_len) { int i; for(i=0;iCaption="s1= " s1; Label2->Caption="s2= " s2; Label3->Caption="ss1= " ss1; Label4->Caption="ss2= " ss2; ana_string(ss1.c_str(),ss1.Length()); ana_string(ss2.c_str(),ss2.Length()); Label5->Caption="s1= " s1; Label6->Caption="s2= " s2; Label7->Caption="ss1= " ss1; Label8->Caption="ss2= " ss2; } //---------------------------------------------------------------------------
RaynorPao
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-12 15:35:06 IP:203.73.xxx.xxx 未訂閱
引言: 請大家幫我解釋一下,這樣的兩種表示方示有什麼不一樣? String ss1=s1; String ss2=s2; String ss1=(char *)s1.c_str(); String ss2=(char *)s2.c_str(); 我在 Form1 宣告了兩個 public 的String s1,s2; 然後將兩個全域變數array a[] b[] 的值給 s1 s2
Eigen 你好: 你知道 String 是一個 structure 嗎?? struct String { WORD wLength; WORD wValueLength; WORD wType; WCHAR szKey[]; WORD Padding[]; WORD Value[]; }; 備註: 我猜喔~~你是不是應該用 AnsiString 而不是 String 呢?? --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-12 15:53:54 IP:211.23.xxx.xxx 未訂閱
在BCB中, 你可以在某個.h檔裡面找到! #define String AnsiString 也就是說! 用String 等於用AnsiString <---我有一本書也是這麼寫的    To Eigen 兄: AnsiString的'=' 是一個類別的多型觀念(應該沒寫錯吧) 一般AnsiString的'=' 你可以看成以前傳統C的strcpy, 很類似     而為什麼你用char* 去作等於的動作時, 為什麼指到同一塊memory? 因為你用到指標! AnsiString.c_str() 就會傳回AnsiString的指標 用指標的話, 就是想用不同的變數來指到相同的記憶體! 這部份可能 你要在指標方面多努力一下下囉
RaynorPao
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-12 16:02:13 IP:203.73.xxx.xxx 未訂閱
引言: 在BCB中, 你可以在某個.h檔裡面找到! #define String AnsiString 也就是說! 用String 等於用AnsiString <---我有一本書也是這麼寫的
哈哈~~小弟我一時不查 String 在 BCB 中的定義 謝謝~~lcsboy 版主的提醒 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-12 16:16:03 IP:211.23.xxx.xxx 未訂閱
引言:
引言: 在BCB中, 你可以在某個.h檔裡面找到! #define String AnsiString 也就是說! 用String 等於用AnsiString <---我有一本書也是這麼寫的
哈哈~~小弟我一時不查 String 在 BCB 中的定義 謝謝~~lcsboy 版主的提醒 -- >< face="Verdana, Arial, Helvetica"> 在 >, 尤其是' ' 但是要用'='時, 要小心囉, 有注意事項的囉 ^^ (不過是發生在
Eigen
初階會員


發表:19
回覆:36
積分:26
註冊:2002-12-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-12 21:11:50 IP:61.216.xxx.xxx 未訂閱
引言: 在BCB中, 你可以在某個.h檔裡面找到! #define String AnsiString 也就是說! 用String 等於用AnsiString <---我有一本書也是這麼寫的 To Eigen 兄: AnsiString的'=' 是一個類別的多型觀念(應該沒寫錯吧) 一般AnsiString的'=' 你可以看成以前傳統C的strcpy, 很類似 而為什麼你用char* 去作等於的動作時, 為什麼指到同一塊memory? 因為你用到指標! AnsiString.c_str() 就會傳回AnsiString的指標 用指標的話, 就是想用不同的變數來指到相同的記憶體! 這部份可能 你要在指標方面多努力一下下囉 < face="Verdana, Arial, Helvetica"> String ss1=s1;//ss1 s1 String ss2=s2;//ss2 s2 會指到同個一個memory 搞了很久我才用下面的方式搞定 String ss1=(char *)s1.c_str();//ss1 s1 才會指到不同的 memory String ss2=(char *)s2.c_str(); 我實在搞不懂為什麼會這樣
RaynorPao
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-12 22:04:38 IP:61.221.xxx.xxx 未訂閱
引言: String ss1=s1;//ss1 s1 String ss2=s2;//ss2 s2 會指到同個一個memory 搞了很久我才用下面的方式搞定 String ss1=(char *)s1.c_str();//ss1 s1 才會指到不同的 memory String ss2=(char *)s2.c_str(); 我實在搞不懂為什麼會這樣
Eigen 你好: (1)以下文章轉貼自 bcb help < class="code"> AnsiString::operator= Assigns the string rhs to this AnsiString. AnsiString& __fastcall operator =(const AnsiString& rhs); Description Use this operator to assign the value of the AnsiString from another AnsiString.
AnsiString::c_str
Returns the AnsiString converted to null-terminated character array.
char* __fastcall c_str() const;
Description
c_str returns a pointer a null-terminated character array containing the same characters as the AnsiString. If the AnsiString is unassigned, c_str returns an empty string (?).
Usually, the value returned by c_str points to the internal character array referenced by the data property. This pointer is valid until the string is next modified (for example when the SetLength method is called or the AnsiString goes out of scope). However, if the internal array is NULL, c_str returns a pointer to a string literal. 
The c_str method is intended primarily for reading the value of the AnsiString. To modify the strings value, use the [] operator or AnsiString methods such as Insert and Delete.
AnsiString c_str() example
AnsiString::c_str() returns a non const temporary pointer to the internal string buffer in the AnsiString object. The pointer is invalid once the statement in which it is used has finished executing. That is,don't do something like this:
   char* cp = Edit1->Text.c_str();
   char* cp2 = strtok( cp, " \t\n" ); // cp may no longer be valid
If you need a persistent pointer, you MUST copy the string into its own buffer:
   char* cp = new char[ Edit1->Text.Length()   1 ];
   strcpy( cp, Edit1->Text.c_str() );
(2)以下是我自己做的實驗 < class="code"> void __fastcall TForm1::Button1Click(TObject *Sender) { char a[]="abcdefghij"; char b[]="1234567890"; String s1, s2, ss1, ss2, sss1, sss2; char szBuf[16]={0}; s1=a; s2=b; ss1=s1; ss2=s2; sss1=s1.c_str(); sss2=s2.c_str(); sprintf(szBuf, "addr(s1)=lX", s1); Label1->Caption=szBuf; Label2->Caption=s1; sprintf(szBuf, "addr(s2)=lX", s2); Label3->Caption=szBuf; Label4->Caption=s2; sprintf(szBuf, "addr(ss1)=lX", ss1); Label5->Caption=szBuf; Label6->Caption=ss1; sprintf(szBuf, "addr(ss2)=lX", ss2); Label7->Caption=szBuf; Label8->Caption=ss2; sprintf(szBuf, "addr(sss1)=lX", sss1); Label9->Caption=szBuf; Label10->Caption=sss1; sprintf(szBuf, "addr(sss2)=lX", sss2); Label11->Caption=szBuf; Label12->Caption=sss2; }
(3)結論(我依照文件及實驗的結果做的推論)
(>    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
系統時間:2024-04-20 19:24:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!