乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      CString與string、char*的區(qū)別和轉(zhuǎn)換

       好景宜人 2015-08-03


      轉(zhuǎn)自:http://blog.csdn.net/luoweifu/article/details/20232379

      我們?cè)?span style="font-family:Times New Roman">C++的開(kāi)發(fā)中經(jīng)常會(huì)碰到string、char*以及CString,這三種都表示字符串類(lèi)型,有很多相似又不同的地方,常常讓人混淆。下面詳細(xì)介紹這三者的區(qū)別、聯(lián)系和轉(zhuǎn)換:



      各自的區(qū)別

      char*:

      char*是一個(gè)指向字符的指針,是一個(gè)內(nèi)置類(lèi)型??梢灾赶蛞粋€(gè)字符,也可以表示字符數(shù)組的首地址(首字符的地址)。我們更多的時(shí)候是用的它的第二的功能,來(lái)表示一個(gè)字符串,功能與字符串?dāng)?shù)組char ch[n]一樣,表示字符串時(shí),最后有一個(gè) '\0'結(jié)束符作為字符串的結(jié)束標(biāo)志。

      【例1

      1. #include <iostream>  
      2. using namespace std;  
      3. void testCharArray()  
      4. {  
      5.     char ch1[12] = "Hello Wrold"; //這里只能ch1[12],ch1[11]編譯不通過(guò),提示array bounds overflow  
      6.     char *pch1 , *pch2 = "string";  
      7.     char *pch3, *pch4;  
      8.     pch3 = &ch1[2]; //ch1[2]的地址賦給pch3  
      9.     char ch = 'c';  
      10.     pch4 = &ch;  
      11.     pch1= ch1;  
      12.     cout << ch1 << endl;    //輸出ch1[0]到\0之前的所有字符  
      13.     cout << pch1 << endl;   //輸出ch1[0]到\0之前的所有字符  
      14.     cout << pch2 << endl;   //輸出ch1[0]到\0之前的所有字符  
      15.     cout << pch3 << endl;   //輸出ch1[2]到\0之前的所有字符  
      16.     cout << *pch3 << endl;  //解引用pch3輸出pch3指向的字符  
      17.     cout << *pch4 << endl;  //解引用pch4輸出pch4指向的字符  
      18. }  

      結(jié)果為:

      Hello Wrold

      Hello Wrold

      string

      llo Wrold

      l

      C

       

      string:

      string是C++標(biāo)準(zhǔn)庫(kù)(STL)中的類(lèi)型,它是定義的一個(gè)類(lèi),定義在<string>頭文件中。里面包含了對(duì)字符串的各種常用操作,它較char*的優(yōu)勢(shì)是內(nèi)容可以動(dòng)態(tài)拓展,以及對(duì)字符串操作的方便快捷,用+號(hào)進(jìn)行字符串的連接是最常用的操作。

      【例2

      1. #include <string>  
      2. void testString()  
      3. {  
      4.     string s1 = "this";  
      5.     string s2 = string(" is");  
      6.     string s3, s4;  
      7.     s3 = string(" a").append("string.");  
      8.     s4 = s1 + s2 + s3;  
      9.     cout << s1 << endl;  
      10.     cout << s2 << endl;  
      11.     cout << s3 << endl;  
      12.     cout << s4 << endl;  
      13.     cout << s4.size() << endl;  
      14.     s4.insert(s4.end()-7, 1, ' ');  
      15.     cout << s4 << endl;  
      16. }  

      結(jié)果為:

      this

       is

       astring.

      this is astring.

      16

      this is a string.

       

      CString

      CString常用于MFC編程中,是屬于MFC的類(lèi),如從對(duì)話(huà)框中利用GetWindowText得到的字符串是CString類(lèi)型CString定義在<afx.h>頭文件中。CStringtypedef CStringT> CString)為Visual C++中最常用的字符串類(lèi),繼承自CSimpleStringT類(lèi),主要應(yīng)用在MFCATL編程中,所以使用CString時(shí)要包含afx.h文件#include <afx.h>。

      【例3

      1. #include <afx.h>  
      2. //因?yàn)镃String不是標(biāo)準(zhǔn)C++庫(kù)定義的類(lèi)型,沒(méi)有對(duì)<<運(yùn)算符進(jìn)行重載,  
      3. //所以不能通過(guò)cout<<cstr來(lái)輸出內(nèi)容,只能自己先定義一個(gè)方法。  
      4. void printCString(const CString &cstr);  
      5. void testCString()  
      6. {  
      7.     char *ch = "Hello";  
      8.     string s = "Wrold";  
      9.     CString cstr1(ch), cstr2(s.c_str()), cstr3("Program");  
      10.     printCString(cstr1);  
      11.     printCString(cstr2);  
      12.     printCString(cstr3);  
      13.     CString cstr4, cstr5;  
      14.     cstr4 = cstr1 + cstr2 + cstr3;  
      15.     cstr5 = cstr1 + " " + cstr2 + " " + cstr3;  
      16.     printCString(cstr4);  
      17.     printCString(cstr5);  
      18. }  
      19.   
      20. void printCString(const CString &cstr)   
      21. {  
      22.     int n = cstr.GetLength();  
      23.     for(int i=0; i<n; i++)  
      24.     {  
      25.         printf("%c", cstr[i]);  
      26.     }  
      27.     printf("\n");  
      28. }  

      結(jié)果為:

      Hello

      Wrold

      Program

      HelloWroldProgram

      Hello Wrold Program

       

      更多關(guān)于CString的用法請(qǐng)參考:http://www.cnblogs.com/Caiqinghua/archive/2009/02/16/1391190.html

       

      使用CString時(shí)可能會(huì)遇到的一些錯(cuò)誤:

       

      編譯時(shí)會(huì)發(fā)現(xiàn)類(lèi)似如下錯(cuò)誤:

          Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] C:\Program Files (x86)\Microsoft Visual Studio 8\VC\ce\atlmfc\include\AFX.h 24

      解決方法:

      (注:我用的開(kāi)發(fā)環(huán)境是VS2010,其它VS的環(huán)境類(lèi)似操作)

      方法1這里錯(cuò)誤提示的意思是缺少_AFXDLL這個(gè)宏,因此在Project——>property中,C/C++里面Preprocessor(預(yù)編譯),加入_AFXDLL這個(gè)宏,OK搞定??!

      方法2對(duì)著你的項(xiàng)目點(diǎn)擊右鍵,依次選擇:屬性、配置屬性、常規(guī),然后右邊有個(gè)“項(xiàng)目默認(rèn)值,下面有個(gè)MFC的使用,選擇在共享 DLL 中使用 MFC”,就OK了~~~

      參考文章:http://blog.csdn.net/ahjxly/article/details/8465209

                               http://blog.csdn.net/zhoxier/article/details/7929920

       

      講明白了char*、stringCString的關(guān)系,可能有人對(duì)<string.h>、<cstring.h><string>這幾個(gè)頭文件又糊涂了,由于篇幅的原因,這部分的內(nèi)容將在下一節(jié)進(jìn)行說(shuō)明,歡迎閱讀:<string> 與<string.h>、<cstring>的區(qū)別

       



      相互的轉(zhuǎn)換

      既然這三種類(lèi)型都可用于表示字符串,但又是不同的類(lèi)型,那他們?nèi)绾无D(zhuǎn)換呢?可用的方法參見(jiàn)如下:

      char*與string的轉(zhuǎn)換

      【例4】

      1. void pCharToString()  
      2. {  
      3.     //from char* to string  
      4.     char * ch = "hello world";  
      5.     string s1 = ch; //直接初始化或賦值  
      6.     string s2(ch), s3;  
      7.     s3 = string(ch);  
      8.     cout << s1 << endl;  
      9.     cout << s2 << endl;  
      10.     cout << s3 << endl;  
      11.     //from string to char*  
      12.     string str = string("string is commonly used.");  
      13.     /************************************************************************* 
      14.     其實(shí)沒(méi)有很大的必要將string轉(zhuǎn)換成char*,因?yàn)閟tring可以直接當(dāng)成字符數(shù)組來(lái)使用, 
      15.     即通過(guò)下標(biāo)來(lái)訪(fǎng)問(wèn)字符元素,如str[1]表示第1個(gè)字符't' 
      16.     **************************************************************************/  
      17.     const char *ch1 = str.c_str();    
      18.     cout << ch1 << endl;  
      19. }  

      結(jié)果為:

      hello world

      hello world

      hello world

      string is commonly used.


      char*與CString

      【例5】

      1. void pCharToCString()  
      2. {  
      3.     //from char* to CString  
      4.     char *ch = "char pointer.";  
      5.     CString cStr1 = ch;  
      6.     CString cStr2 = CString(ch);  
      7.     printCString(cStr1);  
      8.     printCString(cStr2);  
      9.     //from CString to char*  
      10.     CString cstr = "CString";  
      11.     char* chs=cstr.getbuffer(0);//此方法在VS2010下編譯不通過(guò),原因見(jiàn)【例6】  
      12.     cout << chs << endl;  
      13. }  

      結(jié)果為:

      char pointer.

      char pointer.

      CString


      stringCString

      【例6】

      1. void stringToCString()  
      2. {  
      3.     //from string to CString  
      4.     string s1 = "string1 to CString";  
      5.     string s2 = "string2 to CString";  
      6.     string s3 = "string3 to CString";  
      7.     CString cstr(s1.c_str());  
      8.     printCString(cstr);  
      9.     CString cstr2;  
      10.     cstr2.Format("%s", s2.c_str()); // string to CString  
      11.     printCString(cstr2);  
      12.     cstr2.Format("%s", s3.data());  // string to CString  
      13.     printCString(cstr2);  
      14.   
      15.     //from CString to string  
      16.     CString cstr3 = "CString to string3";  
      17.     CString cstr4 = "CString to string4";  
      18.     string str;  
      19.     str=cstr3.GetBuffer(0);  
      20.     cout << str << endl;  
      21.     str = LPCSTR(cstr4);   
      22.     cout << str << endl;  
      23. }  

      結(jié)果為:

      string1 to CString

      string2 to CString

      string3 to CString

      CString to string3

      CString to string4


      c_str()和data()區(qū)別是:前者返回帶'/0'的字符串,后者則返回不帶'/0'的字符串.

      在VS2010環(huán)境下,cstr2.Format("%s", s2.c_str());cstr2.Format("%s", s3.data());及str=cstr3.GetBuffer(0);str = LPCSTR(cstr4); 可能會(huì)編不過(guò),會(huì)報(bào)類(lèi)似error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [3]' to 'const wchar_t *'的錯(cuò)誤。這是因?yàn)槟愕墓こ痰淖址皇嵌嘧止?jié)字符集,將你的工程屬性設(shè)置為多字節(jié)字符集即可,方法是:右鍵點(diǎn)擊你的工程,選擇Properties\Configurations Properties\General,在右側(cè)的Project Defaults下的Character Set選擇Use Multi-Byte Character Set。


      總結(jié)

      從靈活度來(lái)說(shuō),string最靈活易用,其次是CStringchar*的拓展性和靈活性比較差。 一般來(lái)說(shuō)在基于標(biāo)準(zhǔn)庫(kù)開(kāi)發(fā)時(shí)用string,在在MFCATL編程時(shí)用CString

      CString、string之間的轉(zhuǎn)換還有其它的一些方向,但基本上都是通過(guò)char*作為橋梁,因?yàn)?span style="font-family:Arial">char*即可以方便地轉(zhuǎn)換成string,也可以方便地轉(zhuǎn)換成CString。

       

      更多CString的用法也可參考以下鏈接,他們寫(xiě)的更詳細(xì),我就不再重復(fù)了。

      http://www.cnblogs.com/Caiqinghua/archive/2009/02/16/1391190.html

      http://blog.csdn.net/lewutian/article/details/6787024






      歡迎加入"C/C++夢(mèng)之隊(duì)" 學(xué)習(xí)群:226157456




      版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得用于任何商業(yè)用途,轉(zhuǎn)載請(qǐng)注明出處。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多