CString是一個(gè)字符串類,CString a定義了一個(gè)字符串類對(duì)象。CString類里面有很多函數(shù),當(dāng)然也包括構(gòu)造函數(shù),你可以去查一查MSDN
在桓臺(tái)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需制作網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營(yíng)銷網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),桓臺(tái)網(wǎng)站建設(shè)費(fèi)用合理。
CString的構(gòu)造函數(shù)
CString( );
例:CString csStr;
CString( const CString stringSrc );
例:CString csStr("ABCDEF中文123456");
CString csStr2(csStr);
CString( TCHAR ch, int nRepeat = 1 );
例:CString csStr('a',5);
//csStr="aaaaa"
CString( LPCTSTR lpch, int nLength );
例:CString csStr("abcdef",3);
//csStr="abc"
CString( LPCWSTR lpsz );
例:wchar_t s[]=L"abcdef";
CString csStr(s);
//csStr=L"abcdef"
CString( const unsigned char* psz );
例:const unsigned char s[]="abcdef";
const unsigned char* sp=s;
CString csStr(sp);
//csStr="abcdef"
CString( LPCSTR lpsz );
例:CString csStr("abcdef");
//csStr="abcdef"
int GetLength( ) const;
返回字符串的長(zhǎng)度,不包含結(jié)尾的空字符。
例:csStr="ABCDEF中文123456";
printf("%d",csStr.GetLength()); //16
void MakeReverse( );
顛倒字符串的順序
例:csStr="ABCDEF中文123456";
csStr.MakeReverse();
coutcsStr; //654321文中FEDCBA
void MakeUpper( );
將小寫字母轉(zhuǎn)換為大寫字母
例:csStr="abcdef中文123456";
csStr.MakeUpper();
coutcsStr; //ABCDEF中文123456
void MakeLower( );
將大寫字母轉(zhuǎn)換為小寫字母
例:csStr="ABCDEF中文123456";
csStr.MakeLower();
coutcsStr; //abcdef中文123456
int Compare( LPCTSTR lpsz ) const;
區(qū)分大小寫比較兩個(gè)字符串,相等時(shí)返回0,大于時(shí)返回1,小于時(shí)返回-1
例:csStr="abcdef中文123456";
csStr2="ABCDEF中文123456";
coutcsStr.CompareNoCase(csStr2); //0
int CompareNoCase( LPCTSTR lpsz ) const;
不區(qū)分大小寫比較兩個(gè)字符串,相等時(shí)返回0,大于時(shí)返回1,小于時(shí)返回-1
例:csStr="abcdef中文123456";
csStr2="ABCDEF中文123456";
coutcsStr.CompareNoCase(csStr2); //-1
int Delete( int nIndex, int nCount = 1 )
刪除字符,刪除從下標(biāo)nIndex開(kāi)始的nCount個(gè)字符
例:csStr="ABCDEF";
csStr.Delete(2,3);
coutcsStr; // ABF
//當(dāng)nIndex過(guò)大,超出對(duì)像所在內(nèi)存區(qū)域時(shí),函數(shù)沒(méi)有任何操作。
//當(dāng)nIndex為負(fù)數(shù)時(shí),從第一個(gè)字符開(kāi)始刪除。
//當(dāng)nCount過(guò)大,導(dǎo)致刪除字符超出對(duì)像所在內(nèi)存區(qū)域時(shí),會(huì)發(fā)生無(wú)法預(yù)料的結(jié)果。
//當(dāng)nCount為負(fù)數(shù)時(shí),函數(shù)沒(méi)有任何操作。
int Insert( int nIndex, TCHAR ch )
int Insert( int nIndex, LPCTSTR pstr )
在下標(biāo)為nIndex的位置,插入字符或字符串。返回插入后對(duì)象的長(zhǎng)度
例:csStr="abc";
csStr.Insert(2,'x');
coutcsStr; //abxc
csStr="abc";
csStr.Insert(2,"xyz");
coutcsStr; //abxyzc
//當(dāng)nIndex為負(fù)數(shù)時(shí),插入在對(duì)象開(kāi)頭
//當(dāng)nIndex超出對(duì)象末尾時(shí),插入在對(duì)象末尾
int Remove( TCHAR ch );
移除對(duì)象內(nèi)的指定字符。返回移除的數(shù)目
例:csStr="aabbaacc";
csStr.Remove('a');
coutcsStr; //bbcc
int Replace( TCHAR chOld, TCHAR chNew );
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
替換字串
例:csStr="abcdef";
csStr.Replace('a','x');
coutcsStr; //xbcdef
csStr="abcdef";
csStr.Replace("abc","xyz");
coutcsStr; //xyzdef
void TrimLeft( );
void TrimLeft( TCHAR chTarget );
void TrimLeft( LPCTSTR lpszTargets );
從左刪除字符,被刪的字符與chTarget或lpszTargets匹配,一直刪到第一個(gè)不匹配的字符為止
例:csStr="aaabaacdef";
csStr.TrimLeft('a');
coutcsStr; //baacdef
csStr="aaabaacdef";
csStr.TrimLeft("ab");
coutcsStr; //cdef
//無(wú)參數(shù)時(shí)刪除空格
void TrimRight( );
void TrimRight( TCHAR chTarget );
void TrimRight( LPCTSTR lpszTargets );
從右刪除字符,被刪的字符與chTarget或lpszTargets匹配,一直刪到第一個(gè)不匹配的字符為止
例:csStr="abcdeaafaaa";
csStr.TrimRight('a');
coutcsStr; //abcdeaaf
csStr="abcdeaafaaa";
csStr.TrimRight("fa");
coutcsStr; //abcde
//無(wú)參數(shù)時(shí)刪除空格
void Empty( );
清空
例:csStr="abcdef";
csStr.Empty();
printf("%d",csStr.GetLength()); //0
BOOL IsEmpty( ) const;
測(cè)試對(duì)象是否為空,為空時(shí)返回零,不為空時(shí)返回非零
例:csStr="abc";
coutcsStr.IsEmpty(); //0;
csStr.Empty();
coutcsStr.IsEmpty(); //1;
int Find( TCHAR ch ) const;
int Find( LPCTSTR lpszSub ) const;
int Find( TCHAR ch, int nStart ) const;
int Find( LPCTSTR pstr, int nStart ) const;
查找字串,nStart為開(kāi)始查找的位置。未找到匹配時(shí)返回-1,否則返回字串的開(kāi)始位置
int FindOneOf( LPCTSTR lpszCharSet ) const;
查找lpszCharSet中任意一個(gè)字符在CString對(duì)象中的匹配位置。未找到時(shí)返回-1,否則返回字串的開(kāi)始位置
CString SpanExcluding( LPCTSTR lpszCharSet ) const;
返回對(duì)象中與lpszCharSet中任意匹配的第一個(gè)字符之前的子串
CString SpanIncluding( LPCTSTR lpszCharSet ) const;
從對(duì)象中查找與lpszCharSe中任意字符不匹配的字符,并返回第一個(gè)不匹配字符之前的字串
int ReverseFind( TCHAR ch ) const;
從后向前查找第一個(gè)匹配,找到時(shí)返回下標(biāo)。沒(méi)找到時(shí)返回-1
void Format( LPCTSTR lpszFormat, ... );
void Format( UINT nFormatID, ... );
格式化對(duì)象,與C語(yǔ)言的sprintf函數(shù)用法相同
TCHAR GetAt( int nIndex ) const;
返回下標(biāo)為nIndex的字符,與字符串的[]用法相同
//當(dāng)nIndex為負(fù)數(shù)或超出對(duì)象末尾時(shí),會(huì)發(fā)生無(wú)法預(yù)料的結(jié)果。
void SetAt( int nIndex, TCHAR ch );
給下標(biāo)為nIndex的字符重新賦值
CString Left( int nCount ) const;
從左取字串
CString Right( int nCount ) const;
從右取字串
CString Mid( int nFirst ) const;
CString Mid( int nFirst, int nCount ) const;
從中間開(kāi)始取字串
LPTSTR GetBuffer( int nMinBufLength );
申請(qǐng)新的空間,并返回指針
void ReleaseBuffer( int nNewLength = -1 );
使用GetBuffer后,必須使用ReleaseBuffer以更新對(duì)象內(nèi)部數(shù)據(jù)
LPTSTR GetBufferSetLength( int nNewLength );
申請(qǐng)新的空間,并返回指針
1.CString::IsEmpty
BOOL IsEmpty( ) const;
返回值:如果CString 對(duì)象的長(zhǎng)度為0,則返回非零值;否則返回0。
說(shuō)明:此成員函數(shù)用來(lái)測(cè)試一個(gè)CString 對(duì)象是否是空的。
2.CString::Left
CString Left( int nCount ) const;
throw( CMemoryException );
返回值:返回的字符串是前nCount個(gè)字符。
返回值:如果加載資源成功則返回非零值;否則返回0。
nID 一個(gè)Windows 字符串資源ID。
說(shuō)明: 此成員函數(shù)用來(lái)讀取一個(gè)由nID 標(biāo)識(shí)的Windows 字符串資源,并放入一個(gè)已有CString 對(duì)象中。
4.CString::MakeLower
void MakeLower( ); //改變字符的小寫
5.CString::MakeReverse
void MakeReverse( ); //字符倒置
6.CString::MakeUpper
void MakeUpper( ); //改變字符的大寫
7.CString::Mid
CString Mid( int nFirst ) const;
CString Mid( int nFirst, int nCount ) const;
nCount代表要提取的字符數(shù), nFirst代表要提取的開(kāi)始索引位置
8.CString::ReleaseBuffer
void ReleaseBuffer( int nNewLength = -1 );
參數(shù):nNewLength
此字符串的以字符數(shù)表示的新長(zhǎng)度,不計(jì)算結(jié)尾的空字符。如果這個(gè)字
符串是以空字符結(jié)尾的,則參數(shù)的缺省值-1 將把CString 的大小設(shè)置為
字符串的當(dāng)前長(zhǎng)度。
說(shuō)明:
使用ReleaseBuffer 來(lái)結(jié)束對(duì)由GetBuffer 分配的緩沖區(qū)的使用。如果你知道緩
沖區(qū)中的字符串是以空字符結(jié)尾的,則可以省略nNewLength 參數(shù)。如果字符
串不是以空字符結(jié)尾的,則可以使用nNewLength 指定字符串的長(zhǎng)度。在調(diào)用
ReleaseBuffer 或其它CString 操作之后,由GetBuffer 返回的地址是無(wú)效的。
9.CString::Remove
int CString::Remove ( TCHAR ch );
返回值:返回從字符串中移走的字符數(shù)。如果字符串沒(méi)有改變則返回零。
參數(shù):ch 要從一個(gè)字符串中移走的字符。
說(shuō)明:此成員函數(shù)用來(lái)將ch 實(shí)例從字符串中移走。與這個(gè)字符的比較是區(qū)分大小寫
的。
10.CString::Replace
int Replace( TCHAR chOld, TCHAR chNew );
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
返回值:返回被替換的字符數(shù)。如果這個(gè)字符串沒(méi)有改變則返回零。
參數(shù):chOld 要被chNew 替換的字符。
chNew 要用來(lái)替換chOld 的字符。
lpszOld 一個(gè)指向字符串的指針,該字符串包含了要被lpszNew 替換的字符。
LpszNew 一個(gè)指向字符串的指針,該字符串包含了要用來(lái)替換lpszOld 的字符。
說(shuō)明:此成員函數(shù)用一個(gè)字符替換另一個(gè)字符。函數(shù)的第一個(gè)原形在字符串中用chNew
現(xiàn)場(chǎng)替換chOld。函數(shù)的第二個(gè)原形用lpszNew 指定的字符串替換lpszOld 指定
的子串。
在替換之后,該字符串有可能增長(zhǎng)或縮短;那是因?yàn)閘pszNew 和lpszOld 的長(zhǎng)度
不需要是相等的。兩種版本形式都進(jìn)行區(qū)分大小寫的匹配。
11.CString::ReverseFind
int ReverseFind( TCHAR ch ) const;
返回值: 返回此CString 對(duì)象中與要求的字符匹配的最后一個(gè)字符的索引;如果沒(méi)有找
到需要的字符則返回-1。
參數(shù): ch 要搜索的字符。
說(shuō)明:此成員函數(shù)在此CString 對(duì)象中搜索與一個(gè)子串匹配的最后一個(gè)字符。此函數(shù)
類似于運(yùn)行時(shí)函數(shù)strrchr。
12.CString::Right
CString Right( int nCount ) const;
throw( CMemoryException );
返回值: 返回的字符串是最后nCount個(gè)字符。
CString s( _T("abcdef") );
ASSERT( s.Right(2) == _T("ef") );
13.CString:: SetAt
void SetAt( int nIndex, TCHAR ch );
說(shuō)明:可以把字符串理解為一個(gè)數(shù)組,SetAt類似于[].注意nIndex的范圍,如果不合適會(huì)有調(diào)試錯(cuò)誤。 Ch 更替字符, 把nIndex位置上的字符 變成ch
14.CString::TrimLeft
void TrimLeft( );
void CString::TrimLeft( TCHAR chTarget );
說(shuō)明:如果沒(méi)有參數(shù),從左刪除字符(\n\t空格等),至到遇到一個(gè)非此類字符. 當(dāng)然你也可以指定刪除那些字符. 如果指定的參數(shù)是字符串,那么遇上其中的一個(gè)字符就刪除.
\n 換行符
\t TAB字符
15.CString::TrimRight
void TrimRight( );
void CString::TrimRight( TCHAR chTarget );
void CString::TrimRight( LPCTSTR lpszTargets );
說(shuō)明:用法類似于上面。
16.CString::Compare
int Compare( LPCTSTR lpsz ) const;
返回值:字符串一樣返回0,小于lpsz 返回-1,大于lpsz 返回1, 區(qū)分大小字符
17.CString::Collate
int Collate( LPCTSTR lpsz ) const;
同CString::Compare
18.CString::CollateNoCase
int CollateNocase( LPCTSTR lpsz ) const;
同CString::CompareNoCase
19.CString::CString //構(gòu)造函數(shù)
CString( );
CString( const CString stringSrc );
CString( TCHAR ch, int nRepeat = 1 );
CString( LPCTSTR lpch, int nLength );
CString( const unsigned char* psz );
CString( LPCWSTR lpsz );
CString( LPCSTR lpsz );
20.CString::Delete
int Delete( int nIndex, int nCount = 1);
返回值:是被刪除前的字符串的長(zhǎng)度
nIndex是第一個(gè)被刪除的字符,nCount是一次刪除幾個(gè)字符。根據(jù)我實(shí)驗(yàn)得出的結(jié)果:當(dāng)nCount要?jiǎng)h除字符串的最大長(zhǎng)度(GetCount() - nIndex)時(shí)會(huì)出錯(cuò),當(dāng)nCount過(guò)大,沒(méi)有足夠的字符刪除時(shí),此函數(shù)不執(zhí)行。
21.CString::Empty
Void Empty( );
返回值:沒(méi)有返回值 清空操作;
22.CString::Find
int Find( TCHAR ch ) const;
int Find( LPCTSTR lpszSub ) const;
int Find( TCHAR ch, int nStart ) const;
int Find( LPCTSTR lpszSub, int nStart ) const;
返回值: 不匹配的話返回 -1; 索引以0 開(kāi)始; nStar 代表以索引值nStart 的字符開(kāi)始搜索 ,
即為包含以索引nStart字符后的字符串.
23.CString::FindOneOf
int FindOneOf( LPCTSTR lpszCharSet ) const;
返回值: 不匹配的話返回 -1; 索引以0 開(kāi)始
注意::返回此字符串中第一個(gè)在lpszCharSet中也包括字符并且從零開(kāi)始的索引值
24.CString::Format
void Format( LPCTSTR lpszFormat, ... );
void Format( UINT nFormatID, ... );
參數(shù):lpszFormat 一個(gè)格式控制字符串
nFormatID 字符串標(biāo)識(shí)符
25.CString::GetAt
TCHAR GetAt( int nIndex ) const;
返回值:返回標(biāo)號(hào)為nIndex的字符,你可以把字符串理解為一個(gè)數(shù)組,GetAt類似于[].注意nIndex的范圍,如果不合適會(huì)有調(diào)試錯(cuò)誤。
26.CString::GetBuffer
LPTSTR GetBuffer( int nMinBufLength );
返回值:一個(gè)指向?qū)ο蟮模ㄒ钥兆址Y(jié)尾的)字符緩沖區(qū)的LPTSTR 指針。
參數(shù):nMinBufLength
字符緩沖區(qū)的以字符數(shù)表示的最小容量。這個(gè)值不包括一個(gè)結(jié)尾的空字符的空間。
說(shuō)明:此成員函數(shù)返回一個(gè)指向CString 對(duì)象的內(nèi)部字符緩沖區(qū)的指針。返回的LPTSTR 不是const,因此可以允許直接修改CString 的內(nèi)容。如果你使用由GetBuffer 返回的指針來(lái)改變字符串的內(nèi)容,你必須在使用其它的CString 成員函數(shù)之前調(diào)用ReleaseBuffer 函數(shù)。
在調(diào)用ReleaseBuffer 之后,由GetBuffer 返回的地址也許就無(wú)效了,因?yàn)槠渌腃String 操作可能會(huì)導(dǎo)致CString 緩沖區(qū)被重新分配。如果你沒(méi)有改變此CString 的長(zhǎng)度,則緩沖區(qū)不會(huì)被重新分配。當(dāng)此CString 對(duì)象被銷毀時(shí),其緩沖區(qū)內(nèi)存將被自動(dòng)釋放。
注意:如果你自己知道字符串的長(zhǎng)度,則你不應(yīng)該添加結(jié)尾的空字符。但是,當(dāng)你用ReleaseBuffer 來(lái)釋放該緩沖區(qū)時(shí),你必須指定最后的字符串長(zhǎng)度。如果你添加了結(jié)尾的空字符,你應(yīng)該給ReleaseBuffer 的長(zhǎng)度參數(shù)傳遞-1 ,ReleaseBuffer 將對(duì)該緩沖區(qū)執(zhí)行strlen 來(lái)確定它的長(zhǎng)度。
27.CString::GetLength
int GetLength( ) const;
返回值:返回字符串中的字節(jié)計(jì)數(shù)。
說(shuō)明:此成員函數(shù)用來(lái)獲取這個(gè)CString 對(duì)象中的字節(jié)計(jì)數(shù)。這個(gè)計(jì)數(shù)不包括結(jié)尾的空字符。
對(duì)于多字節(jié)字符集(MBCS),GetLength 按每一個(gè)8 位字符計(jì)數(shù);即,在一個(gè)多字節(jié)字符中的開(kāi)始和結(jié)尾字節(jié)被算作兩個(gè)字節(jié)。
28.CString::Insert
int Insert( int nIndex, TCHAR ch );
int Insert( int nIndex, LPCTSTR pstr );
返回值:返回修改后的長(zhǎng)度,nIndex是字符(或字符串)插入后的索引號(hào)例子
1、打開(kāi)Dev-C++軟件,單擊文件菜單中的保存按鈕。
2、將編輯好的程序,保存為C語(yǔ)言格式。
3、頭文件處在程序的最上方。
4、書(shū)寫頭文件時(shí),先輸入#號(hào)。
5、接著,書(shū)寫英文單詞include,include的意思是包括。
6、然后,書(shū)寫尖括號(hào),用來(lái)引用。
7、最后,在尖括號(hào)中,書(shū)寫引用文件名。
8、注意引用文件名之后,要有一個(gè)英文字母h。
如果你想按文件的形式來(lái)組織,可以這樣做:
定義一個(gè)頭文件:cstring.h,再定義一個(gè)源文件:cstring.c,編譯器會(huì)將兩者對(duì)應(yīng)起來(lái)。
首先頭文件:
/*頭文件的說(shuō)明,你自己寫吧*/
#ifndef cstring_h
#define cstring_h
#endif
/*如果想在C++中使用,可以添加以下代碼*/
#ifdef __cplusplus
extern "C" {
#endif
/*The lines within extern "C" */
#ifdef __cplusplus
}
#endif
#includestdio.h
struct manth /*一般不在頭文件里給出結(jié)構(gòu)體的具體結(jié)構(gòu),你的程序不大給出也影響不大*/
{ int k;
char a[80];
char b[80];
char c1;
}p;
/*此處開(kāi)始聲明函數(shù)類型*/
#pragma +
extern void save();
extern oid cpy(char a[],char b[]);
extern int cmp(char a[],char b[]);
extern int len(char a[]);
extern void cat(char a[],char b[]);
extern void lwr(char a[]);
extern void upr(char a[]);
extern void shuchu(char a[]);
extern void shuru(char a[]);
extern int cstring (int i,char a[],char b[]);
#pragma -
void save()
{
FILE *fp;
int i;
if((fp=fopen("cstring(1).txt","wb"))==NULL)
{
printf("do not open it!\n");
return;
}
if(fwrite(p,sizeof(struct manth),1,fp)!=1)
printf("wrong\n");
fclose(fp);
}
void cpy(char a[],char b[])
{
int i=0;
while(b[i]!=0)
{
a[i]=b[i];
i++;
}
a[i]='\0';
}
int cmp(char a[] ,char b[])
{
int i=0,j=0;
while(a[i]!='\0')
i++;
while(b[j]!='\0')
j++;
if(ij) return 1;
else if(i==j) return 0;
else return -1;
}
int len(char a[])
{
int i=0;
while(a[i]!='\0')
i++;
return i;
}
void cat(char a[] ,char b[])
{
int i=0,j=0;
while(a[i]!='\0')
i++;
while(b[j]!='\0')
{
a[i]=b[j];
i++,j++;
}
}
void lwr(char a[])
{
int i=0;
for(i=0;a[i]!='\0';i++)
if(a[i]=65a[i]=90)
a[i]=a[i]+32;
}
void upr(char a[])
{
int i=0;
for(i=0;a[i]!='\0';i++)
if(a[i]=97a[i]=122)
a[i]=a[i]-32;
}
void shuchu(char a[])
{
printf("%s",a);
}
void shuru(char a[])
{
scanf("%s",a);
}
int cstring(int k,char a[],char b[])
{
int z=0;
switch(k)
{
case 1: cpy(a,b); break;
case 2: z=cmp(a,b); break;
case 3: z=len(a); break;
case 4: cat(a,b); break;
case 5: lwr(a); break;
case 6: upr(a); break;
case 7: shuchu(a); break;
case 8: shuru(a); break;
default: printf("enter error"); break;
}
return z;
}
其次是源文件:cstring.c
#include "cstring.h" /*自己定義的頭文件一般用雙引號(hào)*/
int main()
{
printf("1.strcpy,2.strcmp,3.strlen,4.strcat\n5.strlwr,6.strupr,7.strputs,8.strgets\n");
loop: { printf("enter a choice\n");
do
{
scanf("%d",p.k);
if(p.k==1||p.k==2||p.k==4)
{
printf("input two string\n");
scanf("%s %s",p.a,p.b);
}
else if (p.k==3||p.k==6||p.k==7||p.k==8||p.k==5)
{
printf("input a string\n");
scanf("%s",p.a);
}
else
printf("enter error,please enter again\n");
}
while(p.k1||p.k8);
cstring(p.k,p.a,p.b);
if(p.k==2||p.k==3)
printf("%d",cstring(p.k,p.a,p.b));
else if(p.k==1||p.k==4||p.k==5||p.k==6)
shuchu(p.a);
save();
printf("\nif continue(y/n)?\n");
system("pause");
scanf("%c",p.c1);
if(p.c1=='y')
goto loop;
else if(p.c1=='n')
return 0;}
}
/*注:頭文件中定義函數(shù)的結(jié)構(gòu)使用了extern,方便其他文件調(diào)用。還有就是其中的函數(shù)我沒(méi)檢查,都是復(fù)制你的,只是按文件組織了一下,不知道對(duì)不對(duì),還請(qǐng)高手指正*/
CString是MFC提供的字符串類型
需要包含相應(yīng)的MFC庫(kù),貌似是afx.h
string是STL(標(biāo)準(zhǔn)模板庫(kù))中的字符串類型,
可以用在c++程序中(.cpp擴(kuò)展名)。需要包含string頭文件