請問 c_str() |
尚未結案
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
大家好 ^^":
我是很新的新手o
在http://delphi.ktop.com.tw/topic.php?topic_id=55216
看到nlj859大人寫:
AnsiString aaa="哥哥 76 爸 88 100";
strcpy(str,aaa.c_str());
覺很奇怪,為什不寫:
strcpy(str,aaa); 怎跑出 .c_scr() ?? 我想問兩問題,一我查 strcpy(字串1,字串2),
請問aaa.c_str()是字串還是pointer? 二,請問"什時機"用此 字串.c_dtr()? 有什地方不同於此也用
*.c_scr() ?
在查help如下:
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() ); 謝謝,請多指教
Best Regard
|
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
Hellp kmp, 寫法1:
char str[30];
AnsiString aaa="哥哥 76 爸 88 100";
strcpy(str,aaa.c_str());
如果沒加.c_str().會照成Type mismatch,如底下錯誤:
[C Error] Unit1.cpp(29): E2034 Cannot convert 'AnsiString' to 'const char *'
[C Error] Unit1.cpp(29): E2342 Type mismatch in parameter '__src' (wanted 'const char *', got 'AnsiString') 寫法2:
char str[30];
char *aaa="哥哥 76 爸 88 100";
strcpy(str,aaa); 有錯請指正.希望高手補充.
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
kmp 您好: 經測試發現(參考dstring.h檔).c_str()傳回的是(char *),也就是字串的起始位址。
所以 "aaa.c_str()是字串還是pointer?" ,您說的似乎都對,因為在C中字串是用起始位址表示。
由於AnsiString是個類別(class),字串內容只是其中的一個資料成員,所以當您要使用它時,可以透過成員函式(.c_str())取得其字串資料的起始位置,作相關的運用;不過很明顯的,您只是得到一個位址,如果您希望獲得一份相同的內容,那就要將目前指到的資料複製到您宣告的字元陣列中。
底下程式碼,提供簡要參考,欲知詳情可閱讀dstring.h檔。
//--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { char str[30], *ptr; AnsiString aaa="哥哥 76 爸 88 100"; ShowMessage(IntToStr( (__int64)aaa.c_str() )); // 傳回值是個位址 ptr = aaa.c_str(); // 取得aaa中字串內容的位址 //strcpy(str,aaa.c_str()); // 與下一列結果相同 strcpy(str, ptr); // 得到一份copy,存入str中 ShowMessage(str); } //---------------------------------------------------------------------------RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
引言: 小的很感謝兩位大人對我這新手詳細的講解, 若是 *.c_str() 是一個指標,這指標可能像ptr,這樣的名字, 大家一看不會看成別的,只是後者透過指標宣告,前者是字串 內定用法,為什字串要這樣用,您有詳細說明o >>< face="Verdana, Arial, Helvetica"> 在C/C 裡,原始的字串是靠起始位址來指明該字串所在,並且以為零的char值表示此字串到此結束,如此不管陣列多大,只要知道起始位址,就可以將整個字串取出。 有好有壞,其實這樣會導致字串相加與複製等,不容易操作,當然有其他函式可用(strcat(.), strlen(.),strcpy(.)等),但總沒有直接用相加的表示法來得方便使用。 所以後來提供的AnsiString就方便多了,不過要轉回原來的形式,就會稍微不一樣了。 原始的C/C 字串在很多情形下,都要用到,所以還是得了解他們。 底下程式碼可供測試參考://--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { char msg[] = "0123456789"; ShowMessage(msg); // => "0123456798" ShowMessage(msg 5); // => "56789" msg[5] = 0; // msg[] => "01234_6798" ShowMessage(msg); // => "01234" } //---------------------------------------------------------------------------RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
hi~richtop :
謝謝,您好, myfile=fopen(OpenDialog1->FileName.c_str(),"rb"); 請問在此,若不用*.c_str(),可行嗎?
請問這不是字串,為什也要用? * * *
以及您的程式我也有些不懂,請教,以//為我問的o
Best Regard
kmp
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { char msg[] = "0123456789"; ShowMessage(msg); // => "0123456798" ShowMessage(msg 5); // => "56789" //不懂,為什加5變這樣? //好像是像左shift 5,<< 5 msg[5] = 0; // msg[] => "01234_6798" //為什不是"012340678"? ShowMessage(msg); // => "01234" //這我也不懂? 改變msg // 只有上一行o } //--------------------------------------------------------------------------- |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
引言: hi~richtop : 謝謝,您好, myfile=fopen(OpenDialog1->FileName.c_str(),"rb"); 請問在此,若不用*.c_str(),可行嗎? 請問這不是字串,為什也要用? fopen(filename,"rb"); 其中filename必須是以0為結束字元的字串,所以必須要使用OpenDialog1->FileName.c_str()。 * * * 以及您的程式我也有些不懂,請教,以//為我問的o Best Regard kmpRichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####//--------------------------------------------------------------------------- 底下程式的主要用意在說明C/C 中對字串的操作,沒有說明的很清楚害您產生更多的疑問,不好意思。 msg其實也是個指標,指向字串"0123456789"所在的位址。 msg 5:則是表示以msg為起始位址,再往後5個char的位址,即指到上述字串中的字元'5',但結束位址不變,所以印出"56789"。 void __fastcall TForm1::Button1Click(TObject *Sender) { char msg[] = "0123456789"; ShowMessage(msg); // => "0123456798" ShowMessage(msg 5); // => "56789" //不懂,為什加5變這樣? //好像是像左shift 5,<< 5 msg[5] = 0; // msg[] => "01234_6798" //為什不是"012340678"? 因msg[5] = 0(此為數值0,非字元'0');所以在C/C 中會認為字串始於msg,結束於msg[5],所以印出"01234"。 ShowMessage(msg); // => "01234" //這我也不懂? 改變msg // 只有上一行o } //--------------------------------------------------------------------------- |
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |