zoukankan      html  css  js  c++  java
  • CString与string、char*的区别和转换

    转自:http://blog.csdn.net/luoweifu/article/details/20232379

    我们在C++的开发中经常会碰到string、char*以及CString,这三种都表示字符串类型,有很多相似又不同的地方,常常让人混淆。下面详细介绍这三者的区别、联系和转换:

     

     

    各自的区别

    char*:

    char*是一个指向字符的指针,是一个内置类型。可以指向一个字符,也可以表示字符数组的首地址(首字符的地址)。我们更多的时候是用的它的第二的功能,来表示一个字符串,功能与字符串数组char ch[n]一样,表示字符串时,最后有一个 ''结束符作为字符串的结束标志。

    【例1】

     

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #include <iostream>  
    2. using namespace std;  
    3. void testCharArray()  
    4. {  
    5.     char ch1[12] = "Hello Wrold"; //这里只能ch1[12],ch1[11]编译不通过,提示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]到之前的所有字符  
    13.     cout << pch1 << endl;   //输出ch1[0]到之前的所有字符  
    14.     cout << pch2 << endl;   //输出ch1[0]到之前的所有字符  
    15.     cout << pch3 << endl;   //输出ch1[2]到之前的所有字符  
    16.     cout << *pch3 << endl;  //解引用pch3输出pch3指向的字符  
    17.     cout << *pch4 << endl;  //解引用pch4输出pch4指向的字符  
    18. }  

    结果为:

    Hello Wrold

    Hello Wrold

    string

    llo Wrold

    l

    C

     

    string:

    string是C++标准库(STL)中的类型,它是定义的一个类,定义在<string>头文件中。里面包含了对字符串的各种常用操作,它较char*的优势是内容可以动态拓展,以及对字符串操作的方便快捷,用+号进行字符串的连接是最常用的操作。

    【例2】

     

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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. }  

    结果为:

    this

     is

     astring.

    this is astring.

    16

    this is a string.

     

    CString

    CString常用于MFC编程中,是属于MFC的类,如从对话框中利用GetWindowText得到的字符串就是CString类型,CString定义在<afx.h>头文件中。CString(typedef CStringT> CString)为Visual C++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,所以使用CString时要包含afx.h文件#include <afx.h>。

    【例3】

     

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #include <afx.h>  
    2. //因为CString不是标准C++库定义的类型,没有对<<运算符进行重载,  
    3. //所以不能通过cout<<cstr来输出内容,只能自己先定义一个方法。  
    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(" ");  
    28. }  

    结果为:

    Hello

    Wrold

    Program

    HelloWroldProgram

    Hello Wrold Program

     

    更多关于CString的用法请参考:http://www.cnblogs.com/Caiqinghua/archive/2009/02/16/1391190.html

     

    使用CString时可能会遇到的一些错误:

     

    编译时会发现类似如下错误:

        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 8VCceatlmfcincludeAFX.h 24

    解决方法:

    (注:我用的开发环境是VS2010,其它VS的环境类似操作)

    方法1:这里错误提示的意思是缺少_AFXDLL这个宏,因此在Project——>property中,C/C++里面Preprocessor(预编译),加入_AFXDLL这个宏,OK搞定!!

    方法2:对着你的项目点击右键,依次选择:属性、配置属性、常规,然后右边有个“项目默认值”,下面有个MFC的使用,选择“在共享 DLL 中使用 MFC”,就OK了~~~

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

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

     

    讲明白了char*、string及CString的关系,可能有人对<string.h>、<cstring.h>、<string>这几个头文件又糊涂了,由于篇幅的原因,这部分的内容将在下一节进行说明,欢迎阅读:《<string> 与<string.h>、<cstring>的区别

     

     

     

    相互的转换

    既然这三种类型都可用于表示字符串,但又是不同的类型,那他们如何转换呢?可用的方法参见如下:

    char*与string的转换

    【例4】

     

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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.     其实没有很大的必要将string转换成char*,因为string可以直接当成字符数组来使用, 
    15.     即通过下标来访问字符元素,如str[1]表示第1个字符't' 
    16.     **************************************************************************/  
    17.     const char *ch1 = str.c_str();    
    18.     cout << ch1 << endl;  
    19. }  

    结果为:

    hello world

    hello world

    hello world

    string is commonly used.

     

    char*与CString

    【例5】

     

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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下编译不通过,原因见【例6】  
    12.     cout << chs << endl;  
    13. }  

    结果为:

    char pointer.

    char pointer.

    CString

     

    string与CString

    【例6】

     

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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. }  

    结果为:

    string1 to CString

    string2 to CString

    string3 to CString

    CString to string3

    CString to string4

     

    c_str()和data()区别是:前者返回带'/0'的字符串,后者则返回不带'/0'的字符串.

    在VS2010环境下,cstr2.Format("%s", s2.c_str());cstr2.Format("%s", s3.data());及str=cstr3.GetBuffer(0);str = LPCSTR(cstr4); 可能会编不过,会报类似error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [3]' to 'const wchar_t *'的错误。这是因为你的工程的字符集不是多字节字符集,将你的工程属性设置为多字节字符集即可,方法是:右键点击你的工程,选择PropertiesConfigurations PropertiesGeneral,在右侧的Project Defaults下的Character Set选择Use Multi-Byte Character Set。

     

    总结

    从灵活度来说,string最灵活易用,其次是CString,char*的拓展性和灵活性比较差。 一般来说在基于标准库开发时用string,在在MFC和ATL编程时用CString。

    CString、string之间的转换还有其它的一些方向,但基本上都是通过char*作为桥梁,因为char*即可以方便地转换成string,也可以方便地转换成CString。

     

    更多CString的用法也可参考以下链接,他们写的更详细,我就不再重复了。

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

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

  • 相关阅读:
    优化SQL查询:如何写出高性能SQL语句
    提高SQL执行效率的16种方法
    Spring Ioc DI 原理
    java内存泄漏
    转:js闭包
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Best Time to Buy and Sell Stock with Cooldown
    LeetCode Length of Longest Fibonacci Subsequence
    LeetCode Divisor Game
    LeetCode Sum of Even Numbers After Queries
  • 原文地址:https://www.cnblogs.com/xingkai/p/6387339.html
Copyright © 2011-2022 走看看