① CString與string,char*的區別和轉換
我們在C++的開發中經常會碰到string、char*以及CString,這三種都表示字元串類型,有很多相似又不同的地方,常常讓人混淆。下面詳細介紹這三者的區別、聯系和轉換:
各自的區別
char*:
char*是一個指向字元的指針,是一個內置類型。可以指向一個字元,也可以表示字元數組的首地址(首字元的地址)。我們更多的時候是用的它的第二的功能,來表示一個字元串,功能與字元串數組char ch[n]一樣,表示字元串時,最後有一個 '\0'結束符作為字元串的結束標志。
string:
string是C++標准庫(STL)中的類型,它是定義的一個類,定義在<string>頭文件中。裡麵包含了對字元串的各種常用操作,它較char*的優勢是內容可以動態拓展,以及對字元串操作的方便快捷,用+號進行字元串的連接是最常用的操作。
CString
CString常用於MFC編程中,是屬於MFC的類,如從對話框中利用GetWindowText得到的字元串就是CString類型,CString定義在<afx.h>頭文件中。CString(typedef CStringT> CString)為Visual C++中最常用的字元串類,繼承自CSimpleStringT類,主要應用在MFC和ATL編程中,所以使用CString時要包含afx.h文件#include <afx.h>。
② c++ string類的基本功能是什麼和頭文件是<cstring>的庫函數有什麼區別還有<st
string.h包含一些c語言的庫函數,有關字元串操作的,有一下的函數可以用,strlen(),strcat(),strcpy(),strcmp()等等。
③ CString string char等字元類型的相關知識和轉換
以下內容轉自:
http://space.itpub.net/16856446/viewspace-612824
CString,int,string,char*之間的轉換
string 轉 CString
CString.format(」%s」, string.c_str());
char 轉 CString
CString.format(」%s」, char*);
char 轉 string
string s(char *);
string 轉 char *
char *p = string.c_str();
CString 轉 string
string s(CString.GetBuffer());
1,string -> CString
CString.format(」%s」, string.c_str());
用c_str()確實比data()要好.
2,char -> string
string s(char *);
你的只能初始化,在不是初始化的地方最好還是用assign().
3,CString -> string
string s(CString.GetBuffer());
GetBuffer()後一定要ReleaseBuffer(),否則就沒有釋放緩沖區所佔的空間.
《C++標准函數庫》中說的
有三個函數可以將字元串的內容轉換為字元數組和C—string
1.data(),返回沒有」\0「的字元串數組
2,c_str(),返回有」\0「的字元串數組
3,()
—————————————————————
CString與int、char*、char[100]之間的轉換- -
CString與int、char*、char[100]之間的轉換- -
CString互轉int
將字元轉換為整數,可以使用atoi、_atoi64或atol。
而將數字轉換為CString變數,可以使用CString的Format函數。如
CString s;
int i = 64;
s.Format(」%d」, i)
Format函數的功能很強,值得你研究一下。
void CStrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString
ss=」1212.12〃;
int temp=atoi(ss);
CString aa;
aa.Format(」%d」,temp);
AfxMessageBox(」var is 」 + aa);
}
sart.Format(」%s」,buf);
CString互轉char*
///char * TO cstring
CString strtest;
char * charpoint;
charpoint=」give string a value」;
strtest=charpoint;
///cstring TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());
標准C里沒有string,char *==char []==string
可以用CString.Format(」%s」,char *)這個方法來將char *轉成CString。要把CString轉成char *,用操作符(LPCSTR)CString就可以了。
CString轉換 char[100]
char a[100];
CString str(」aaaaaa」);
strncpy(a,(LPCTSTR)str,sizeof(a));
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1570001
(一) 概述
string和CString均是字元串模板類,string為標准模板類(STL)定義的字元串類,已經納入C++標准之中;
CString(typedef CStringT > CString)為Visual C++中最常用的字元串類,繼承自CSimpleStringT類,主要應用在MFC和ATL編程中,主要數據類型有char(應用於ANSI),wchar_t(unicode),TCHAR(ANSI與unicode均可);
char*為C編程中最常用的字元串指針,一般以』\0′為結束標志;
(二) 構造
string是方便的,可以從幾乎所有的字元串構造而來,包括CString和char*;
CString次之,可以從基本的一些字元串變數構造而來,包括char*等;
char*沒有構造函數,僅可以賦值;
舉例:
char* psz = 「joise」;
CString cstr( psz );
string str( cstr );
(三) 運算符重載
a) perator=
string是最方便的,幾乎可以直接用所有的字元串賦值,包括CString和char*;
CString次之,可以直接用些基本的字元串賦值,包括char*等;
char*只能由指針賦值,並且是極危險的操作,建議使用strcpy或者memcpy,而且char*在聲明的時候如未賦初值建議先設為NULL,以避免野指針,令你抓狂;
舉例:
char *psz = NULL;
psz = new char[10]; //當然,以上的直接寫成char *psz = new char[10];也是一樣
memset( psz, 0, 10 );
strcpy( psz, 「joise」 );
CString cstr;
cstr = psz;
string str;
str = psz;
str = cstr;
delete []psz;
b) operator+
string與CString差不多,可以直接與char*進行加法,但不可以相互使用+運算符,即string str = str + cstr是非法的,須轉換成char*;
char*沒有+運算,只能使用strcat把兩個指針連在一起;
舉例:
char* psz = 「joise」;
CString cstr = psz;
cstr = cstr + psz;
string str = psz;
str = str + str + psz;
strcat( psz, psz );
strcat( psz, cstr );//合法
strcat( psz, str );//非法,由此可見,CString可自動轉換為const char*,而string不行
c) operator +=
string是最強大的,幾乎可以與所有的字元串變數+=,包括CString和char*;
CString次之,可以與基本的一些字元串變數進行+=而來,包括char*等;
char*沒有+=運算符,只能使用strcat把兩個指針連在一起;
d) operator[]
CString最好,當越界時會拋出斷言異常;
string與char*下標越界結果未定義;
舉例:
char* psz = 「joise」;
CString cstr = psz;
cout << cstr[8];
string str = psz;
cout << str[8];
cout << psz[8];
e) perator== 、operator!=、operator> 、operator< 、operator>= 、perator<=
CString與string之間不可以進行比較,但均可以與char*進行比較,並且比較的是值,而不是地址;
cout << ( psz == cstr );
cout << ( psz == str );
cout << ( str == psz );
cout << ( cstr == psz );//以上代碼返回均為1
(四) 常用演算法
a) 查找
作用 char* string CString
查找指定值 strchr
strstr
strrstr
strspn find Find
第一個匹配的值 fild_first_of FindOneOf 從後面開始查找 ReserveFind 指定匹配方式 find_if
註:find_if中是把范圍內的值挨個代入匹配函數直至返回true
b) 比較
作用 char* string CString 查找指定值(區分大小寫) strcmp
strncmp
strcoll
_strncoll operator<
operator>
operator<=
operator>=
operator==
operator!= Collate
Compare 查找指定值(不區分大小寫) _stricmp
_strnicmp
_str違規廣告
_strn違規廣告 CollateNoCase
CompareNoCas
註:返回值如果<0則前面的值小於後面的值,反之亦然
c) 替換
作用 char* string CString 查找指定值 _strset
_strnset
replace
replace_
replace__if
replace_if Replace
d) 插入
作用 char* string CString 查找指定值 insert Insert
e) 增加 作用 char* string CString 動態增加值 strcat push
append Append
AppendChar
AppendFormat
f) 截取
作用 char* string CString 得到部分值 用下標操作 substr Left
Mid
Right
Truncate
g) 移除
作用 char* string CString 移除部份值 remove Remove 移除空白值 RemoveBlanks
註:此為ATL提供,非C函數 remove_if Trim
TrimLeft
TrimRig
h) 轉換大小寫
作用 char* string CString 轉換大小寫 _strlwr
_strupr MakeLower
MakeUpper
i) 與其他類型轉換
作用 char* string CString 轉化為數字 atoi
atod
atof Format 轉化為char* c_str
GetBuffer
GetBufferSetLen
j) 格式化
作用 char* string CString 格式化 sprintf Format
k) 得到長度
作用 char* string CString
得到長度 strlen length GetLength 得到大小 size GetAllocLength
l) 判斷為空
作用 char* string CString 判斷是否為空 判斷是否==NULL或者第一個字元是否是』\0′ empty IsEmpty
m) 重定義大小
作用 char* string CString 重定義大小 realloc
new resize GetBufferSetLength
n) 釋放資源
作用 char* string CString 釋放 free
delete (delete[]) ReleaseBuffer
ReleaseBufferSetLength
(五) 安全性>
CString > string > char*;
(六) 靈活性
CString > string >char*;
(七) 可移植性
char* = string > CString
④ C++ mfc中,類CString如何分割開啊
1. 標准C中的字元串
在標准C中沒有string這樣的數據類型,C中的字元串是有char類型的字元數組或者char類型的字元指針來實現的。例如:
char name[26]="This is a C-style string"; 或者
char *name="This is a C-style string";
類型的字元串以\0為結束標記,所佔內存是實際子符長度+1,其初始化和賦值都要逐個字元的賦值,修改不辨,粒度太小,很不直觀,是程序員分散了一些軟體的高級層面問題,如演算法,抽象數據類型或軟體構架。char *沒有構造函數,僅能由指針賦值,而且是一個極其危險的操作,在聲明char * 的時候如果沒有賦初值,建議先初始化為NULL,以免出現懸浮指針或者指向地址不明的指針,否則,出錯會讓你很爽!
標准C中是沒有string類型,但是在C中有string.h頭文件,需要注意的是此string.h中的string 非彼string,<string.h>頭文件中定義了一些我們經常用到的操作字元串的函數,如復制函數strcpy,連接字元串strcat,比較字元串strcmp,這些函數的操作對象都是指向char *的字元串。
2.標准C++中的string類
C++支持C風格字元串的使用,而且引入了string類的概念,string為標准模板類STL定義的字元串,幾乎可以從所有的字元串構造出來。
string字元串類的都文件是<string>,並且要和usingnamespace std; 一起使用。頭文件<string>和頭文件<string.h>沒有任何關系,前者是標准C++中的模板庫類,後者是標准C中的包含常用C字元串處理函數的頭文件,如strcmp,前者並非是後者的升級版。
要深刻理解標准C++中string是一個類, 如在標准C中定義如下:char * pt=NULL; 這無疑是正確的,但是在標准C++中定義 string *pt=NULL;這樣做編譯器不會有警告和錯誤,但是運行是就會有異常。這是因為string作為一個類,定義類的對象時要調用其構造函數的,上面的例子既沒有調用其構造函數,還把指針賦值為NULL,很明顯就會出錯的。正確的 方法是是new操作符,C++中的new不同於C中的malloc, new不但會分配一塊內存,還調用類的構造函數。string *pt=new("this is a c++-style string"); 或者不用指針 string str;系統自動調用默認的構造函數,構造一個string類的對象。
3. MFC中的CString類。
MFC中的字元串類是CString,封裝了string的東西,並增加了一些介面,在功能上完全兼容string類,而一些標準的C/C++不能直接對CString類進行操作,CString 類是微軟的visual c++提供的MFC裡面的一個類,所以只有支持MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用標准C++中的 string類了。另外,因為string類是在c++標准庫中,所以它被封裝在了std命名空間中,使用之前需要聲明using namespace std;而CString類並不在std命名空間中,因為它不是c++的標准庫,只是微軟的一個封裝庫。這點看來用string類的程序的移植性更好。CString和string提供的介面方法不同,對char*的轉換也不同。下
⑤ 求CString::Format()常見的用法
學過C語言么?printf會用么?和它的控制模式差不多
⑥ string類和CString類有什麼區別啊
CString 是MFC或者ATL中的實現,
string是C++標准庫中的實現
string和CString均是字元串模板類,string為標准模板類(STL)定義的字元串類,已經納入C++標准之中;
CString(typedef CStringT<TCHAR, StrTraitMFC<TCHAR>> CString)為Visual C++中最常用的字元串類,繼承自CSimpleStringT類,主要應用在MFC和ATL編程中,主要數據類型有char(應用於ANSI),wchar_t(unicode),TCHAR(ANSI與unicode均可);
char*為C編程中最常用的字元串指針,一般以』/0』為結束標志;
在MFC、ATL中使用字元串盡量使用CString,畢竟都是微軟的孩子,各方面都比其它更有優勢,而在非微軟平台上或對移植性要求較高的場合推薦使用string,標准模板庫提供了那麼強大的泛型演算法,沒必要再自己去造車輪。
string是C++標准庫中的類,具有良好的可移植性,標准性等
⑦ 談一談C++標准庫<string>與<cstring>的區別,你認為使用那個庫更方便給出你的理由
c++中 string string.h CString 區別!
c++中 string與string.h 的作用和區別
#include <string.h>
void main()
{
string aaa= "abcsd d";
printf("looking for abc from abcdecd %s\n",
(strcmp(aaa,"abc")) ? "Found" : "Not Found");
}
不能正確執行,提示說是string類型沒有定義
而下面:
#include <string>
using namespace std;
void main()
{
string aaa= "abcsd d";
printf("looking for abc from abcdecd %s\n",
(strcmp(aaa,"abc")) ? "Found" : "Not Found");
}
這里的string編譯器就認識了,但是strcmp就不認識了呢?
一般一個C++的老的帶「.h」擴展名的庫文件,比如iostream.h,在新標准後的標准庫中都有一個不帶「.h」擴展名的相對應,區別除了後者的好多改進之外,還有一點就是後者的東東都塞進了「std」名字空間中。
但唯獨string特別。
問題在於C++要兼容C的標准庫,而C的標准庫里碰巧也已經有一個名字叫做「string.h」的頭文件,包含一些常用的C字元串處理函數,比如樓主提到的strcmp。
這個頭文件跟C++的string類半點關系也沒有,所以<string>並非<string.h>的「升級版本」,他們是毫無關系的兩個頭文件。
要達到樓主的目的,比如同時:
#include <string.h>
#include <string>
using namespace std;
或者
#include <cstring>
#include <string>
其中<cstring>是與C標准庫的<string.h>相對應,但裹有std名字空間的版本。
笑談(來自高質量++)
C++標准庫很大。非常大。難以置信的大。怎麼個大法?這么說吧:在C++
標准中,關於標准庫的規格說明佔了密密麻麻300 多頁,這還不包括標准C 庫,
後者只是"作為參考"(老實說,原文就是用的這個詞)包含在C++庫中。
當然,並非總是越大越好,但在現在的情況下,確實越大越好,因為大的
庫會包含大量的功能。標准庫中的功能越多,開發自己的應用程序時能藉助的
功能就越多。C++庫並非提供了一切(很明顯的是,沒有提供並發和圖形用戶
介面的支持),但確實提供了很多。幾乎任何事你都可以求助於它。
在歸納標准庫中有些什麼之前,需要介紹一下它是如何組織的。因為標准
庫中東西如此之多,你(或象你一樣的其他什麼人)所選擇的類名或函數名就
很有可能和標准庫中的某個名字相同。為了避免這種情況所造成的名字沖突,
實際上標准庫中的一切都被放在名字空間std 中(參見條款28)。但這帶來了
一個新問題。無數現有的C++代碼都依賴於使用了多年的偽標准庫中的功能,
例如,聲明在<iostream.h>,<complex.h>,<limits.h>等頭文件中的功能。現
有軟體沒有針對使用名字空間而進行設計,如果用std 來包裝標准庫導致現有
代碼不能用,將是一種可恥行為。(這種釜底抽薪的做法會讓現有代碼的程序員
說出比"可恥" 更難聽的話)
懾於被激怒的程序員會產生的破壞力,標准委員會決定為包裝了std 的那
部分標准庫構件創建新的頭文件名。生成新頭文件的方法僅僅是將現有C++頭
文件名中的.h 去掉,方法本身不重要,正如最後產生的結果不一致也並不重
要一樣。所以<iostream.h>變成了<iostream>,<complex.h>變成了<complex>,
等等。對於C 頭文件,採用同樣的方法,但在每個名字前還要添加一個c。所
以C 的<string.h>變成了<cstring>,<stdio.h>變成了<cstdio>,等等。最後一
點是,舊的C++頭文件是官方所反對使用的(即,明確列出不再支持),但舊
的C 頭文件則沒有(以保持對C 的兼容性)。實際上,編譯器製造商不會停止
對客戶現有軟體提供支持,所以可以預計,舊的C++頭文件在未來幾年內還是
會被支持。
所以,實際來說,下面是C++頭文件的現狀:
舊的C++頭文件名如<iostream.h>將會繼續被支持,盡管它們不在官方標
准中。這些頭文件的內容不在名字空間std 中。
新的C++頭文件如<iostream>包含的基本功能和對應的舊頭文件相同,但
頭文件的內容在名字空間std 中。(在標准化的過程中,庫中有些部分的細節被
修改了,所以舊頭文件和新頭文件中的實體不一定完全對應。)
標准C 頭文件如<stdio.h>繼續被支持。頭文件的內容不在std 中。
具有C 庫功能的新C++頭文件具有如<cstdio>這樣的名字。它們提供的內
容和相應的舊C 頭文件相同,只是內容在std 中。
所有這些初看有點怪,但不難習慣它。最大的挑戰是把字元串頭文件理清
楚:<string.h>是舊的C 頭文件,對應的是基於char*的字元串處理函數;<string>
是包裝了std 的C++頭文件,對應的是新的string 類(看下文);<cstring>是對
應於舊C 頭文件的std 版本。如果能掌握這些(我相信你能),其餘的也就容易了。
⑧ 求教一個CString類Format函數的有關問題
Format是一個很常用,卻又似乎很煩的方法,以下是它的完整概貌,以供大家查詢之用:格式化字元串forma("%d",12)意思是將一個整形的格式化的字元(我認為是保持其形狀不變)1).格式說明總是以%字元開始,以下是不同類型數據的格式方式%號後的說明:d輸出帶符號十進制數o輸出無符號八進制數x輸出無符號十六進制數u輸出無符號數c輸出單個字元s輸出一串字元f輸出實數(6位小數)e以指數形式輸出實數g選用f與e格式中輸出寬度較小的格式,不輸出0ld輸入輸出long型數據lf輸入輸出double型數據m數據輸出寬度為m.n輸出小數位數為n
⑨ MFC中幾種常用的字元串分割方法
1、CString 自帶的函數Tokenize
CStringT Tokenize( _In_ PCXSTR pszTokens, _Inout_ int& iStart ) const
功能介紹:從iStart位置取出字元串中含pszTokens分割符間的內容;istart是開始分割的位置,一般設為0,下面是一段運用實例:
vector<CString> SplitCString(CString strSource, CString ch){ vector <CString> vecString; intiPos = 0; CString strTmp; strTmp = strSource.Tokenize(ch,iPos); while(strTmp.Trim() != _T("")) { vecString.push_back(strTmp); strTmp = strSource.Tokenize(ch,iPos); }}
上述函數將字元串strSource按照字元串ch進行分割,分割得帶的子字元串放到vector中。其中函數中的iPos是不斷變化的,而Tokenize本身不會改變源字元串。
2、char *strtok(char s[], const char *delim);
功能介紹:分解字元串為一組字元串。s為要分解的字元串,delim為分隔符字元串。首次調用時,s指向要分解的字元串,之後再次調用要把s設成NULL。從s開頭開始的一個個被分割的串。當查找不到delim中的字元時,返回NULL。所有delim中包含的字元都會被濾掉,並將被濾掉的地方設為一處分割的節點。下面是一段運用實例。
vector<CString> SplitCString(CString strSource, charch){ vector<CString> vecString; CString strTmp=strtok((LPSTR)(LPCTSTR)strSource,ch);//(LPSTR)(LPCTSTR)將CString轉char* while(1) { strTmp=strtok(NULL,ch); if(strTmp==_T("")) break; strTmp.TrimLeft(); vecString.push_back(strTmp); }}
與第一種方法有一點區別,上述函數第二個參數是char型的,第一種方法的第二個可以是CString型的,但是實現的功能相似。
3、BOOL AFXAPI AfxExtractSubString ( CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep = 『\n』);
功能介紹:可用於從特定源字元串中提取子字元串。如果函數成功提取了該子字元串中提供的索引,返回TRUE 否則返回FALSE。其中
// rString 對CString將得到一個單獨的子字元串的對象。
// lpszFullString 待分割的字元串。
// iSubString 提取的子字元串的序號,從0開始。假如你想提取第3段,該參數就輸入2
// chSep 用於分割的字元,默認的是』\n』。
下面是一段運用實例
vector<CString> SplitCString(CString strSource, charch){ CString strTmp; vector<CString> vecString; intiPos=0; while(AfxExtractSubString(strTmp,strSource,iPos,ch)) { iPos++; vecString.push_back(strTmp); } returnvecString;}
特別注意:strtok在分割的時候將分割符改變成『/0』了,所以這個函數會修改源字元串,分割符不會包含在分割出來的字元串中,strtok允許多分割字元,比如空格+逗號表示為『 ,』,還有一點需要注意的是如果被分割的字元第一個是分割符,那麼該字元會被忽略掉。如果出現連續的分隔符,那麼也會忽略掉,比如字元串1|2||||3,用strtok來分割將得到1 2 3,但是如果用AfxExtractSubString,得到將會是1 2 空字元串 空字元串 空字元串 3,需求不同選擇不同的函數。
4、利用CString Find函數自己分割字元串
vector<CString> SplitCString(CString strSource, charch){ CString strTmp; vector<CString> vecString; intn=-1; n=strSource.Find(ch) while(n!=-1) { strTmp=strSource.Left(n)//這里根據需要判斷是否需要分隔符 vecString.push_back(strTmp); strSource=strsource.left(strSource.Getlenth-n+1) n=strSource.Find(ch); } returnvecString;}
這種方法功能和上述類似,使用也很靈活,可以根據自己需要分割字元串。
⑩ C/C++ 中cstring用法
CString的構造函數
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;
返回字元串的長度,不包含結尾的空字元。
例:csStr="ABCDEF中文123456";
printf("%d",csStr.GetLength()); //16
void MakeReverse( );
顛倒字元串的順序
例:csStr="ABCDEF中文123456";
csStr.MakeReverse();
cout<<csStr; //654321文中FEDCBA
void MakeUpper( );
將小寫字母轉換為大寫字母
例:csStr="abcdef中文123456";
csStr.MakeUpper();
cout<<csStr; //ABCDEF中文123456
void MakeLower( );
將大寫字母轉換為小寫字母
例:csStr="ABCDEF中文123456";
csStr.MakeLower();
cout<<csStr; //abcdef中文123456
int Compare( LPCTSTR lpsz ) const;
區分大小寫比較兩個字元串,相等時返回0,大於時返回1,小於時返回-1
例:csStr="abcdef中文123456";
csStr2="ABCDEF中文123456";
cout<<csStr.CompareNoCase(csStr2); //0
int CompareNoCase( LPCTSTR lpsz ) const;
不區分大小寫比較兩個字元串,相等時返回0,大於時返回1,小於時返回-1
例:csStr="abcdef中文123456";
csStr2="ABCDEF中文123456";
cout<<csStr.CompareNoCase(csStr2); //-1
int Delete( int nIndex, int nCount = 1 )
刪除字元,刪除從下標nIndex開始的nCount個字元
例:csStr="ABCDEF";
csStr.Delete(2,3);
cout<<csStr; // ABF
//當nIndex過大,超出對像所在內存區域時,函數沒有任何操作。
//當nIndex為負數時,從第一個字元開始刪除。
//當nCount過大,導致刪除字元超出對像所在內存區域時,會發生無法預料的結果。
//當nCount為負數時,函數沒有任何操作。
int Insert( int nIndex, TCHAR ch )
int Insert( int nIndex, LPCTSTR pstr )
在下標為nIndex的位置,插入字元或字元串。返回插入後對象的長度
例:csStr="abc";
csStr.Insert(2,'x');
cout<<csStr; //abxc
csStr="abc";
csStr.Insert(2,"xyz");
cout<<csStr; //abxyzc
//當nIndex為負數時,插入在對象開頭
//當nIndex超出對象末尾時,插入在對象末尾
int Remove( TCHAR ch );
移除對象內的指定字元。返回移除的數目
例:csStr="aabbaacc";
csStr.Remove('a');
cout<<csStr; //bbcc
int Replace( TCHAR chOld, TCHAR chNew );
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
替換字串
例:csStr="abcdef";
csStr.Replace('a','x');
cout<<csStr; //xbcdef
csStr="abcdef";
csStr.Replace("abc","xyz");
cout<<csStr; //xyzdef
void TrimLeft( );
void TrimLeft( TCHAR chTarget );
void TrimLeft( LPCTSTR lpszTargets );
從左刪除字元,被刪的字元與chTarget或lpszTargets匹配,一直刪到第一個不匹配的字元為止
例:csStr="aaabaacdef";
csStr.TrimLeft('a');
cout<<csStr; //baacdef
csStr="aaabaacdef";
csStr.TrimLeft("ab");
cout<<csStr; //cdef
//無參數時刪除空格
void TrimRight( );
void TrimRight( TCHAR chTarget );
void TrimRight( LPCTSTR lpszTargets );
從右刪除字元,被刪的字元與chTarget或lpszTargets匹配,一直刪到第一個不匹配的字元為止
例:csStr="abcdeaafaaa";
csStr.TrimRight('a');
cout<<csStr; //abcdeaaf
csStr="abcdeaafaaa";
csStr.TrimRight("fa");
cout<<csStr; //abcde
//無參數時刪除空格
void Empty( );
清空
例:csStr="abcdef";
csStr.Empty();
printf("%d",csStr.GetLength()); //0
BOOL IsEmpty( ) const;
測試對象是否為空,為空時返回零,不為空時返回非零
例:csStr="abc";
cout<<csStr.IsEmpty(); //0;
csStr.Empty();
cout<<csStr.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為開始查找的位置。未找到匹配時返回-1,否則返回字串的開始位置
int FindOneOf( LPCTSTR lpszCharSet ) const;
查找lpszCharSet中任意一個字元在CString對象中的匹配位置。未找到時返回-1,否則返回字串的開始位置
CString SpanExcluding( LPCTSTR lpszCharSet ) const;
返回對象中與lpszCharSet中任意匹配的第一個字元之前的子串
CString SpanIncluding( LPCTSTR lpszCharSet ) const;
從對象中查找與lpszCharSe中任意字元不匹配的字元,並返回第一個不匹配字元之前的字串
int ReverseFind( TCHAR ch ) const;
從後向前查找第一個匹配,找到時返回下標。沒找到時返回-1
void Format( LPCTSTR lpszFormat, ... );
void Format( UINT nFormatID, ... );
格式化對象,與C語言的sprintf函數用法相同
TCHAR GetAt( int nIndex ) const;
返回下標為nIndex的字元,與字元串的[]用法相同
//當nIndex為負數或超出對象末尾時,會發生無法預料的結果。
void SetAt( int nIndex, TCHAR ch );
給下標為nIndex的字元重新賦值
CString Left( int nCount ) const;
從左取字串
CString Right( int nCount ) const;
從右取字串
CString Mid( int nFirst ) const;
CString Mid( int nFirst, int nCount ) const;
從中間開始取字串
LPTSTR GetBuffer( int nMinBufLength );
申請新的空間,並返回指針
void ReleaseBuffer( int nNewLength = -1 );
使用GetBuffer後,必須使用ReleaseBuffer以更新對象內部數據
LPTSTR GetBufferSetLength( int nNewLength );
申請新的空間,並返回指針
1.CString::IsEmpty
BOOL IsEmpty( ) const;
返回值:如果CString 對象的長度為0,則返回非零值;否則返回0。
說明:此成員函數用來測試一個CString 對象是否是空的。
2.CString::Left
CString Left( int nCount ) const;
throw( CMemoryException );
返回值:返回的字元串是前nCount個字元。
返回值:如果載入資源成功則返回非零值;否則返回0。
nID 一個Windows 字元串資源ID。
說明: 此成員函數用來讀取一個由nID 標識的Windows 字元串資源,並放入一個已有CString 對象中。
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代表要提取的字元數, nFirst代表要提取的開始索引位置
8.CString::ReleaseBuffer
void ReleaseBuffer( int nNewLength = -1 );
參數:nNewLength
此字元串的以字元數表示的新長度,不計算結尾的空字元。如果這個字
符串是以空字元結尾的,則參數的預設值-1 將把CString 的大小設置為
字元串的當前長度。
說明:
使用ReleaseBuffer 來結束對由GetBuffer 分配的緩沖區的使用。如果你知道緩
沖區中的字元串是以空字元結尾的,則可以省略nNewLength 參數。如果字元
串不是以空字元結尾的,則可以使用nNewLength 指定字元串的長度。在調用
ReleaseBuffer 或其它CString 操作之後,由GetBuffer 返回的地址是無效的。
9.CString::Remove
int CString::Remove ( TCHAR ch );
返回值:返回從字元串中移走的字元數。如果字元串沒有改變則返回零。
參數:ch 要從一個字元串中移走的字元。
說明:此成員函數用來將ch 實例從字元串中移走。與這個字元的比較是區分大小寫
的。
10.CString::Replace
int Replace( TCHAR chOld, TCHAR chNew );
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
返回值:返回被替換的字元數。如果這個字元串沒有改變則返回零。
參數:chOld 要被chNew 替換的字元。
chNew 要用來替換chOld 的字元。
lpszOld 一個指向字元串的指針,該字元串包含了要被lpszNew 替換的字元。
LpszNew 一個指向字元串的指針,該字元串包含了要用來替換lpszOld 的字元。
說明:此成員函數用一個字元替換另一個字元。函數的第一個原形在字元串中用chNew
現場替換chOld。函數的第二個原形用lpszNew 指定的字元串替換lpszOld 指定
的子串。
在替換之後,該字元串有可能增長或縮短;那是因為lpszNew 和lpszOld 的長度
不需要是相等的。兩種版本形式都進行區分大小寫的匹配。
11.CString::ReverseFind
int ReverseFind( TCHAR ch ) const;
返回值: 返回此CString 對象中與要求的字元匹配的最後一個字元的索引;如果沒有找
到需要的字元則返回-1。
參數: ch 要搜索的字元。
說明:此成員函數在此CString 對象中搜索與一個子串匹配的最後一個字元。此函數
類似於運行時函數strrchr。
12.CString::Right
CString Right( int nCount ) const;
throw( CMemoryException );
返回值: 返回的字元串是最後nCount個字元。
CString s( _T("abcdef") );
ASSERT( s.Right(2) == _T("ef") );
13.CString:: SetAt
void SetAt( int nIndex, TCHAR ch );
說明:可以把字元串理解為一個數組,SetAt類似於[].注意nIndex的范圍,如果不合適會有調試錯誤。 Ch 更替字元, 把nIndex位置上的字元 變成ch
14.CString::TrimLeft
void TrimLeft( );
void CString::TrimLeft( TCHAR chTarget );
說明:如果沒有參數,從左刪除字元(\n\t空格等),至到遇到一個非此類字元. 當然你也可以指定刪除那些字元. 如果指定的參數是字元串,那麼遇上其中的一個字元就刪除.
\n 換行符
\t TAB字元
15.CString::TrimRight
void TrimRight( );
void CString::TrimRight( TCHAR chTarget );
void CString::TrimRight( LPCTSTR lpszTargets );
說明:用法類似於上面。
16.CString::Compare
int Compare( LPCTSTR lpsz ) const;
返回值:字元串一樣返回0,小於lpsz 返回-1,大於lpsz 返回1, 區分大小字元
17.CString::Collate
int Collate( LPCTSTR lpsz ) const;
同CString::Compare
18.CString::CollateNoCase
int CollateNocase( LPCTSTR lpsz ) const;
同CString::CompareNoCase
19.CString::CString //構造函數
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);
返回值:是被刪除前的字元串的長度
nIndex是第一個被刪除的字元,nCount是一次刪除幾個字元。根據我實驗得出的結果:當nCount>要刪除字元串的最大長度(GetCount() - nIndex)時會出錯,當nCount過大,沒有足夠的字元刪除時,此函數不執行。
21.CString::Empty
Void Empty( );
返回值:沒有返回值 清空操作;
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 開始; nStar 代表以索引值nStart 的字元開始搜索 ,
即為包含以索引nStart字元後的字元串.
23.CString::FindOneOf
int FindOneOf( LPCTSTR lpszCharSet ) const;
返回值: 不匹配的話返回 -1; 索引以0 開始
注意::返回此字元串中第一個在lpszCharSet中也包括字元並且從零開始的索引值
24.CString::Format
void Format( LPCTSTR lpszFormat, ... );
void Format( UINT nFormatID, ... );
參數:lpszFormat 一個格式控制字元串
nFormatID 字元串標識符
25.CString::GetAt
TCHAR GetAt( int nIndex ) const;
返回值:返回標號為nIndex的字元,你可以把字元串理解為一個數組,GetAt類似於[].注意nIndex的范圍,如果不合適會有調試錯誤。
26.CString::GetBuffer
LPTSTR GetBuffer( int nMinBufLength );
返回值:一個指向對象的(以空字元結尾的)字元緩沖區的LPTSTR 指針。
參數:nMinBufLength
字元緩沖區的以字元數表示的最小容量。這個值不包括一個結尾的空字元的空間。
說明:此成員函數返回一個指向CString 對象的內部字元緩沖區的指針。返回的LPTSTR 不是const,因此可以允許直接修改CString 的內容。如果你使用由GetBuffer 返回的指針來改變字元串的內容,你必須在使用其它的CString 成員函數之前調用ReleaseBuffer 函數。
在調用ReleaseBuffer 之後,由GetBuffer 返回的地址也許就無效了,因為其它的CString 操作可能會導致CString 緩沖區被重新分配。如果你沒有改變此CString 的長度,則緩沖區不會被重新分配。當此CString 對象被銷毀時,其緩沖區內存將被自動釋放。
注意:如果你自己知道字元串的長度,則你不應該添加結尾的空字元。但是,當你用ReleaseBuffer 來釋放該緩沖區時,你必須指定最後的字元串長度。如果你添加了結尾的空字元,你應該給ReleaseBuffer 的長度參數傳遞-1 ,ReleaseBuffer 將對該緩沖區執行strlen 來確定它的長度。
27.CString::GetLength
int GetLength( ) const;
返回值:返回字元串中的位元組計數。
說明:此成員函數用來獲取這個CString 對象中的位元組計數。這個計數不包括結尾的空字元。
對於多位元組字元集(MBCS),GetLength 按每一個8 位字元計數;即,在一個多位元組字元中的開始和結尾位元組被算作兩個位元組。
28.CString::Insert
int Insert( int nIndex, TCHAR ch );
int Insert( int nIndex, LPCTSTR pstr );
返回值:返回修改後的長度,nIndex是字元(或字元串)插入後的索引號例子