代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "哈哈"; char *chr = Test.c_str(); } |
代码: |
#include <windef.h><br>void __fastcall TForm1::Button1Click(TObject *Sender) <br>{ <br> AnsiString str = "Sample"; <br> char chr[MAX_PATH]; <br> strcpy( chr , str.c_str() ); <br>} <br></windef.h> |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test=BoolToStr(CheckBox1->Checked); } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test="-1" CheckBox1->Checked= StrToBool( Test ); } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { int i = 123; AnsiString str = IntToStr( i ); } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "123"; long double d = StrToFloat( Test ); } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { double d = 123.456; AnsiString str = FloatToStr( d ); } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { long double d = 123.456121212; AnsiString str = FloatToStrF( d , ffFixed ,5 , 4 ); //说明FloatTostrF里5代表从第几个数字的后一位开始四舍五入,4代表取4位小数。 //执行后得到str是123.4600。:roll: } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { double d = 123.456; AnsiString str = FormatFloat( "000000.00" , d ); } //得到 000123.45,当然你可以使用"# . , ; E+ E- xx"等符号,你自己试试 :wink: |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "0x00FF8080"; TColor Col = StringToColor( Test ); } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { TColor Col = 0x00FF8080; AnsiString str = ColorToString( Col ); } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCDEF"; int First = 3; // 消除制定开头 int Length = 2; // 消除制定长度 AnsiString Dstr = Test.Delete( First , Length ); }//得到ABEF |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCDEF"; AnsiString Ins = "12345"; // 插入串 int Pos = 3; // 在哪插 AnsiString Istr = Test.Insert( Ins , Pos ); //得到AB12345CDEF } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCDEF"; AnsiString Npos = Test[3];//得到C } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCDEF"; char *Lstr = Test.AnsiLastChar();//得到F } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCDEF"; int First = 3; // 3开始取 int Length = 2; // 取2位 AnsiString Getstr = Test.SubString( First , Length ); //得到CD } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCDEF"; AnsiString Sample = "abcdef"; int Result = Test.AnsiCompare( Sample ); 返回1,不同!分大小写。 } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCDEF"; AnsiString Sample = "abcdef"; int Result = Test.AnsiCompareIC( Sample ); //返回0,相同!没有分大小写,哈哈 } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCDEF"; AnsiString Sample = "E"; int Result = Test.Pos( Sample ); //返回5,如果你写Sample="haha",就返回0,找不到,哈哈 } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCDEF"; AnsiString Sample = "EF"; int Result = Test.Pos( Sample ); //返回5,即E字符的位置 } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "拿金币来"; int Len = Test.Length(); //返回8 } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "小苹果然看了这篇文章"; AnsiString SLstr = Test.SetLength(6); }//得到“小苹果” |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString ChkStr = "你好"; int ChkPos = 1 ; if ( ByteType( ChkStr , ChkPos ) == mbSingleByte ){ Edit1->Text="0"; } else{ Edit1->Text="1"; }//返回1,如果你写ChkStr="fxxk",就返回0 } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = ""; bool chk = Test.IsEmpty(); if (chk ) Edit1->Text="1";//返回1 } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCdef"; AnsiString Lstr = Test.LowerCase(); } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = "ABCdef"; AnsiString Ustr = Test.UpperCase(); } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = " ABCDEF "; AnsiString TLstr = Test.TrimLeft(); AnsiString TRstr = Test.TrimRight(); AnsiString Tstr = Test.Trim(); } |
代码: |
AnsiString __fastcall TForm1::TrimStr( AnsiString Tm , AnsiString LR ) { // LR … L:左除去 R:右除去 B:dou除去 int len; // 左除去 if ( LR == "L" || LR == "B" ){ len = Tm.Length(); while ( Tm.SubString(1,1) == " " || Tm.SubString(1,2) == " "){ // 半角除去 if ( Tm.SubString(1,1) == " " ){ Tm = Tm.SubString(2,len); len = Tm.Length(); } // 全角除去 else if ( Tm.SubString(1,2) == " " ){ Tm = Tm.SubString(3,len); len = Tm.Length(); } } } // 右除去 if ( LR == "R" || LR == "B" ){ len = Tm.Length(); while ( Tm.SubString(len,1) == " " || Tm.SubString(len-1,2) == " " ){ // 半角除去 if ( Tm.SubString(len,1) == " " ){ len = Tm.Length(); Tm = Tm.SubString(1,len-1); len = Tm.Length(); } // 全角除去 else if ( Tm.SubString(len-1,2) == " " ){ len = Tm.Length(); Tm = Tm.SubString(1,len-2); len = Tm.Length(); } } } return Tm; } void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Test = " 拳脚 "; AnsiString Ret = TrimStr(Test,"B") } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Soc = AnsiString::StringOfChar( '*' , 100 ); Edit1->Text=Soc ;//显示100个* } |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Str = "Borland C++ Builder is free"; AnsiString From = "C++ Builder"; AnsiString To = "Delphi"; AnsiString Result; Result = StringReplace( Str, From, To, TReplaceFlags() << rfReplaceAll << rfIgnoreCase ); //<<后是参数,得到Borland Delphi is free } |
代码: |
AnsiString Zen = "1234567890"; int Len = Zen.Length(); char buf[MAX_PATH]; ZeroMemory( buf, sizeof( buf ) ); LCMapString( GetUserDefaultLCID(), LCMAP_HALFWIDTH, Zen.c_str(), Len, buf, sizeof( buf ) ); AnsiString Han = AnsiString( buf ); Edit1->Text=Han; |
代码: |
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString Han = "1234567890"; int Len = Han.Length(); char buf[MAX_PATH]; ZeroMemory( buf, sizeof( buf ) ); LCMapString( GetUserDefaultLCID(), LCMAP_FULLWIDTH, Han.c_str(), Len, buf, sizeof( buf ) ); AnsiString Zen = AnsiString( buf ); } |
代码: |
AnsiString Temp = "这是一个测试的AnsiString"; int Length = Temp.Length(); for(int i = 1; i <= Length;i++) { if(Temp[i] > 128) { //........ //筛选其中的汉字; i++; } else { //......非汉字的字符。 } } |
代码: |
__fastcall AnsiString(); __fastcall AnsiString(const char* src); __fastcall AnsiString(const AnsiString& src); __fastcall AnsiString(const char* src, unsigned char len); __fastcall AnsiString(const wchar_t* src); __fastcall AnsiString(int src); __fastcall AnsiString(double src); __fastcall AnsiString(char src); __fastcall AnsiString(short); __fastcall AnsiString(unsigned short); __fastcall AnsiString(unsigned int); __fastcall AnsiString(long); __fastcall AnsiString(unsigned long); __fastcall AnsiString(__int64); __fastcall AnsiString(unsigned __int64); __fastcall AnsiString(const WideString &src); |
代码: |
AnsiString Str1; |
代码: |
AnsiString Str2 = "TestString"; |
代码: |
int Temp = 46573284; AnsiString Str3 = IntToStr(Temp); 和 AnsiString Str4 = Temp; |
代码: |
cout<<string></string> |
代码: |
String str="hello world"; cout<<str></str> |
代码: |
String str; cin>>str; |
代码: |
//--------------------------------------------------------------------------- #pragma hdrstop #include <string><br>#include <iostream><br>#define VCL_IOSTREAM <br>#include <vcl.h><br><br>//--------------------------------------------------------------------------- <br>using namespace std; <br>#pragma argsused <br>int main(int argc, char* argv[]) <br>{ <br> String str="hello world"; <br> string ss(str.c_str()); <br><br> cout<<ss></ss> system("pause"); <br> return 0; <br>} <br></vcl.h></iostream></string> |
这时我们可以使用stl的强大能力来处理String了。
混用AnsiString和c_str()的安全问题by nethobo
当你使用返回AnsiString类型变量的函数,当你要写一个返回AnsiString变量
(不是指针也不是引用)函数时,或者当你使用一个以AnsiString变量为参数的函数,
或者当你整天用VCL控件传入传出AnsiString属性变量时,当这个AnsiString变量
包含很长一个字符串时,你是否有些担心有些不安?担心对象的构造与析构,更担心
的是大字符串的复制(分配内存、内存复制、删除内存)所带来的效率问题?如果你
是一个完美主义者或者是一个比较负责的程序作者比较关系程序效率的话,我想你一
定在每次使用时都有与我一样的这种不安的感觉。
另外当你想要对一个AnsiString变量所含的字符串进行c的char*裸字符串操作时,
你用AnsiString::c_str()获得char*的指针然后对其进行c字符串操作,这时你是否
会担心你所作的是否会与AnsiString冲突呢,当然前提是你不想一上来就用strcpy
自己作一拷贝(还是效率问题)。
下面我就本人近来几天编程中发现的问题来探讨一下AnsiString的效率问题及
其c_str()的安全问题。
BCB的提供了操作动态字符串的类AnsiString的unicode版的WideString,
而且在VCL类中凡用到字符串类型时都是使用的AnsiString。但有时用
c的char*裸字符串来处理一些问题更方便,尤其是在一些编码与解码算法中。
为此AnsiString提供了c_str()函数以返回其内部的char*指针供使用(WideString
中为c_bstr(),问题类似,以下只以AnsiString和c_str为例)。
首先我们看看第二个问题(它和第一个问题直接相关),看下面的代码:
AnsiString src="test AnsiString";
AnsiString strTest=src; //拷贝构造
char* cp=strTest.c_str();
cp[0]='T';
运行完后,strTest和src的值是什么呢?结果可能与你所预想的大不相同,两都的值都
变成了"Test AnsiString"!也就是说cp[0]='T'的操作同时改变了两个AnsiString变量
的值。为什么会这样呢,执行时按下Ctrl鼠标单击两个变量名,你会发现它们两个所指
向内部字符串是同一个!也就是说在拷贝构造(赋值也一样)时并没有象我们想象的那
样进行内部字符串的复制!好了到现在为至我们至少不用为第一个问题担心了,没有了
字符串的复制,单单是对象的构造与析构算不了什么问题了(AnsiString只有一个Data
成员变量)。
然而第二个问题就很严重了,再看下面的代码:
AnsiString src="test AnsiString";
AnsiString strTest=src; //拷贝构造
strTest[1]='x';
char* cp=strTest.c_str();
cp[0]='T';
运行结果就是我们的预期了,为什么加了句strTest[1]='x';就"正常"了呢?很明显
AnsiString为了我们第一个问题中的效率问题采用了copy on write技术,也就是只读
共享,写时拷贝。这样只有在对象要改变其内部数据的值时才做一份自己的拷贝然后在
自己的拷贝中进行修改(就种技术在操作系统中被广泛使用)。同时在对象析构时如果
引用计数大于0,数据也不会被删除,它保证数据的有效性。这样返回AnsiString变量的
函数也就没有严重的效率问题了。
到目前为止,已经真象大白了,结论就是我们不用担心VCL中AnsiString变量传值的
效率问题,另外即使是传值得到的AnsiString对象,我们也不能对其内部数据直接进行
修改(否则你的程序的某些功能模块可以会出现第一次运行正常第二次后就乱七八糟),
尤其是在多线程环境下。原因就不必多说了,大不了复制一份了事。