char* CString string区别

来源:互联网 发布:windows mobile刷安卓 编辑:程序博客网 时间:2024/06/16 00:42

char* CString string区别

点击打开链接


一.介绍

string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中;

CString(typedef CStringT<TCHAR,StrTraitMFC<TCHAR>>CString)为VisualC++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(Unicode),TCHAR(ANSI与unicode均可);

char*为C编程中最常用的字符串指针,一般以’\0’为结束标志;

 

二.赋值以及构造

//这里使用了一个console控制台程序作为实验

编译环境:xp32系统 vs2005英文版

#include <iostream>

#include <Windows.h>

#include <atlstr.h>//在非MFC程序下使用CString类必须加的头文件

#include <string>

using namespace std;

 

int main(void)

{

        //赋值和构造

        char *ch = "Hello World!";

        CStringcstr(ch);     //等价于:CStringcstr = "Hello World!"; CString("HelloWorld!");

        stringstr(ch);       //等价于:stringstr = "Hello World!";  string str("HelloWorld!");

        stringstr(cstr);                          //需设置Use Multi-Byte Character Set属性

        cout<<"char* :"<<ch<<endl; 

        cout<<"string :"<<str<<endl;

        cout<<"string :"<<str.c_str()<<endl;              //c_str()函数:将内容以C_string返回

        wcout<<"CString :"<<cstr.GetString()<<endl;       //wcout输出宽字节

        wcout<<"CString :"<<cstr.GetBuffer()<<endl;

        wcout<<"CString :"<<LPCTSTR(cstr)<<endl;

 

        system("pause");

        return 0;

}

在这里ch是一个字符串指针,自然就没有构造函数,字节赋值就是了,CString和string都是一个类,有构造函数,可以使用基本的字符串构造,包括char*;

Ps:在Win32控制台(console)程序下使用CString有两种方法,第一种:直接添加头文件#include<atlstr.h>,第二种:在solution标签页,右键工程名,选择properties,

弹出text property pages界面,如下图,选择General,在Use of MFC的后面选择 use MFCin a Shared DLL.如下图

如果你使用的是VC++6.0,你可以在菜单栏的 工程->设置中找到此选项。

做完这些后,你还要在程序的前面添加两个头文件,#include<afxwin.h> #include<windows.h>。注意:你必须让#include<afxwin.h> 在#include<windows.h>的前面,这样你就能在程序中使用CString这个类了。

是时候输出来比较下了,在vs默认情况下,使用的是unicode,它在计算机中无论什么时候都是16位的,char*和string都可以用cout直接的输出,但是直接cout CString会出错,你可以在 text propertypages界面Character Set 属性中选择Use Multi-Byte CharacterSet(如果你选择了此选项,你可以使用CString类直接够着string)。或者你也可以使用wcout,实例中使用了这个方法。

3.运算符重载

(1):operator=

我们还是以实例来说明

#include<iostream>

#include <atlstr.h>//在非MFC程序下使用CString类必须加的头文件

#include <string>

using namespace std;

 

int main(void)

{

 

    char *ch ="Hello World!";

    CString cstr=ch;                

    string str =cstr;   //同样要设置Use Multi-ByteCharacterSet属性     

   cout<<"char* :"<<ch<<endl;

   cout<<"string :"<<str<<endl;

   cout<<"string :"<<str.c_str()<<endl;//c_str()函数:返回cstring

   wcout<<"CString :"<<cstr.GetString()<<endl; //wcout输出宽字节

   wcout<<"CString :"<<cstr.GetBuffer()<<endl;

   wcout<<"CString :"<<LPCTSTR(cstr)<<endl;

   system("pause");

    return0;

}

可以看出,最方便的是string ,可以用CString和char*直接赋值;

其次是CString,可以用char*赋值;

Char*只是一个指针赋值。

(2)operator+

我们再来看看重载的+

#include<iostream>

#include <atlstr.h>//在非MFC程序下使用CString类必须加的头文件

#include <string>

using namespace std;

 

int main(void)

{

 

    char *ch ="Hello World!";

    CString cstr= ch;

    string str =cstr;

    string str2= str+ch;   //string + char *

    CStringcstr2 = cstr + ch;//CString + char *

    char *ch2 =new char[20];

   ZeroMemory(ch2,20);

   strcat(ch2,ch);

 

   cout<<"char* :"<<ch<<endl;

   cout<<"char2* :"<<ch2<<endl;  

   cout<<"string :"<<str<<endl;

   cout<<"string2 :"<<str2<<endl;

 

   wcout<<"CString :"<<cstr.GetString()<<endl; //wcout输出宽字节

   wcout<<"CString2 :"<<cstr2.GetString()<<endl;//wcout输出宽字节

   system("pause");

    return0;

}

首先char*没有+运算,它们之间要连接的话可以用strcat函数。

CString和string都可以和char*进行+运算,但是CString和string之间不能 CString cs =str+cstr和string st = str+cstr都是错误的。

(3)operator+

#include<iostream>

#include <atlstr.h>//在非MFC程序下使用CString类必须加的头文件

#include <string>

using namespace std;

 

int main(void)

{

 

    char *ch ="Hello World!";

    CString cstr= ch;

    string str =cstr;

    string str2= ch; //string + char *

   str2+=ch;

   str2+=cstr;

    CStringcstr2 = cstr + ch;//CString + char *

   cstr2+=ch;

   cout<<"char* :"<<ch<<endl;

   cout<<"string :"<<str<<endl;

   cout<<"string2 :"<<str2<<endl;

 

   wcout<<"CString :"<<cstr.GetString()<<endl; //wcout输出宽字节

   wcout<<"CString2 :"<<cstr2.GetString()<<endl;//wcout输出宽字节

   system("pause");

    return0;

}

CString和string都可以和char*进行+=运算

String可以和CString进行+=运算,但是CString+=string就不行

另外string和string之间可以+=运算,CString和CString之间也是可以的。

Char*之间是没有+=运算的,strcat可以实现同样的功能。

(4)operator []

 

#include<iostream>

#include <atlstr.h>//在非MFC程序下使用CString类必须加的头文件

#include <string>

using namespace std;

 

int main(void)

{

 

    char *ch ="Hello World!";

    CString cstr= ch;

    string str =cstr;

 

   cout<<"char* :"<<ch[2]<<endl; 

   cout<<"string :"<<str[2]<<endl;

   wcout<<"CString :"<<cstr[2]<<endl;   //wcout输出宽字节

   system("pause");

    return0;

}

都可以使用[];但是要注意不要越界。越界会发生很严重的错误。

(4)比较

#include<iostream>

#include <atlstr.h>//在非MFC程序下使用CString类必须加的头文件

#include <string>

using namespace std;

 

int main(void)

{

 

    char *ch ="Hello World!";

    CString cstr= ch;

    string str =cstr;

    char *ch2 ="Hellr World!";

 

   cout<<"Result:"<<(ch==str)<<endl;

   cout<<"Result:"<<(cstr==ch)<<endl;

   cout<<"Result:"<<(cstr==ch2)<<endl;

   system("pause");

    return0;

}

CString与string之间不可以进行比较,但均可以与char*进行比较,并且比较的是值,而不是地址。比较成功,结果返回1或者是0。

三.转换

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());

 



0 0
原创粉丝点击