c語言中空格和回車的字符串?char*、string、CString這三種字符串類型各有各的優點,比如CString比較靈活,是基于MFC常用的類型,安全性也最高,但可移植性最差string是使用STL時必不可少的類型,所以是做工程時必須熟練掌握的;char*是從學習C語言開始就已經和我們形影不離的了,有許多API都是以char*作為參數輸入的,我來為大家科普一下關于c語言中空格和回車的字符串?以下内容希望對你有幫助!
char*、string、CString這三種字符串類型各有各的優點,比如CString比較靈活,是基于MFC常用的類型,安全性也最高,但可移植性最差。string是使用STL時必不可少的類型,所以是做工程時必須熟練掌握的;char*是從學習C語言開始就已經和我們形影不離的了,有許多API都是以char*作為參數輸入的。
char*類型:是字符指針,在一定條件下等同于字符數組,如果字符數組的最後元素是"\0",則是一個C風格的字符串。
string類型:标準C中是不存在string類型的,string是标準C 擴充字符串操作的一個類。但是我們知道标準C中有string.h這個頭文件,這裡要區分清楚,此string非彼string。string.h這個頭文件中定義了一些我們經常用到的操作字符串的函數,如:strcpy、strcat、strcmp等等,但是這些函數的操作對象都是char*指向的字符串。 而C 的string類操作對象是string類型字符串,該類重載了一些運算符,添加了一些字符串操作成員函數,使得操作字符串更加方便。有的時候我們要将string串和char*串配合使用,所以也會涉及到這兩個類型的轉化問題。
CString類型:利用MFC進行編程時,我們從對話框中利用GetWindowText得到的字符串是CString類型,CString是屬于MFC的類。而一些标準C/C 庫函數是不能直接對CString類型進行操作的,所以我們經常遇到将CString類型轉化char*等等其他數據類型的情況。
1 需要包含的頭文件char*類型:<string.h>,其中包含有字符串庫函數,如strcat()等,在C 中,<string.h>等同于<cstring>
string類型:<string>,是C 的類庫;
CString類型:<afx.h>,是MFC的類庫;
2 string → CStringstring str = "reading\\bible.chm"; ShellExecute(0,"open",str.c_str(),"",NULL,SW_SHOW); //system(str.c_str());
3 CString → stringCString cstr= "test"; string str = cstr.GetBuffer(0); cstr.releasebuffer(-1);
4 string → char *主要有三種方法可以将str轉換為char*類型,分别是:data(); c_str(); copy();
3.1 data()方法
string str = "hello"; const char* p = str.data(); //加const 或者用char * p=(char*)str.data();的形式
3.2 c_str()方法
string str="world"; const char *p = str.c_str();
c_str()和data()區别是:前者返回帶'\0'的字符串,後者則返回不帶'\0'的字符串
3.3 copy()方法
string str="hmmm"; char p[50]; str.copy(p, 5, 0);//這裡5代表複制幾個字符,0代表複制的位置, *(p 5)='\0';//注意手動加結束符!!! printf("%s",p);
5 char * → stringchar *chs = "C "; string Str = string(chs); //或直接賦值 char *chs = "hello"; string str = chs;
6 CString → char *CString cstr; char* chs; // 三種方法 chs = (char*)cstr.GetBuffer(0); chs = (char*)cstr.GetBuffer(cstr.GetLength()); chs = (char*)(LPCTSTR)cstr;
7 char * → CStringchar *path2 = "F:\\templates\\000txt\\original.txt"; CString cstr = path2; \\直接賦值 \\cstr.Format(_T("%s"), path2); \\ 使用CString對象方法Format CString m_status = "文件成功保存!" cstr strdatetime;
8 CString和int的轉換int i = 123; CString str; str.format( "%d",i); //int->CString 其他的基本類型轉化類似 i = atoi(str); //CString->int 還有(atof,atol)
9 總結一下char *是字符指針,c可以直接做為右值賦值給CString或string類型。在一定條件下,等同于字符數組,是C風格的字符串。
CString和string是類,有類方法或構造方法可供字符轉換使用。CString的format方法是非常好用的。string的c_str()也是非常常用的,可以轉換為CString或char *,但要注意和char *轉換時,要把char定義成為const char*,這樣是最安全的。對于CString與其他類型的轉化方法很多,但其實都殊途同歸,朝着一個方向即将類型首先轉化為char*類型,因為char*是不同類型之間的橋梁。 得到char*類型,轉化為其他類型就非常容易了。
之所以抛棄char*的字符串而選用C 标準程序庫中的string類,是因為他和前者比較起來,不必擔心内存是否足夠、字符串長度等等,而且作為一個類出現,他集成的操作函數足以完成我們大多數情況下(甚至是100%)的需要。我們可以用 = 進行賦值操作,== 進行比較, 做串聯等等。我們盡可以把它看成是C 的基本數據類型。
以上函數UNICODE編碼也沒問題:unicode下照用,加個_T()宏就行了,像這樣子_T("%s")
string類的字符操作:
char &operator[](int n); char &at(int n);
operator[]和at()均返回當前字符串中第n個字符的位置,但at函數提供範圍檢查,當越界時會抛出out_of_range異常,下标運算符[]不提供檢查訪問。
對于CString:
CString s = "This is a test"; // 8-bit only CString s = _T("This is a test"); // Unicode-aware CString s("This is a test"); // 8-bit only CString s(_T("This is a test")); // Unicode-aware CString s = p; CString s(p);
用這些方法可以輕松将常量字符串或指針轉換成 CString。
10 寬字節轉換char *chs = (char *)m_textblock.GetBuffer(0); int k = m_textblock.GetLength(); wchar_t *wc = (wchar_t *)malloc(sizeof(wchar_t)*k); // 将ANSI編碼的多字節字符串轉換成寬字符字符串 int n = MultiByteToWideChar(CP_ACP, 0, chs, strlen(chs), wc, k); if ( n > 0 ) { wc[n] = 0; char *mb = (char *)malloc(sizeof(char)*k*4); //char mb[1024]; // 将寬字符字符串轉換成UTF-8編碼的多字節字符串 n = WideCharToMultiByte(CP_UTF8, 0, wc, wcslen(wc), mb, k*4, NULL, NULL); if ( n > 0 ) { mb[n] = 0; fwrite(mb, sizeof(char), strlen(mb), fp); } free(mb); } free(wc);
-End-
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!