首先先介绍一下什么是CString

CString是MFC的字符串类,它不是基本类型,而是对字符串的封装,它是自适应的,在UNICODE环境下就是CStringW,在非UNICODE环境下就是CStringA。

如从对话框中利用 GetWindowText 得到的字符串就是 CString 类型, CString 定义在头文件中。CString(typedef CStringT> CString) 为 Visual C++ 中最常用的字符串类,

继承自 CSimpleStringT 类,主要应用在 MFC 和 ATL 编程中,所以使用 CString 时要包含 afx.h 文件#include 。

一:char*与string:

1.string----->char*

  1)char *ch = str.c_str();

  2)char* ch = str.data();

  3)string mngName;

     char t[200];

     memset(t,0,200);

     strcpy(t,mngName.c_str());

c_str()与c_data():

简单的例子:
  const char *c_str();

  c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.
  这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
  注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针
  比如:最好不要这样:  

  1.  char* c;
  2.  ";
  3.  c = s.c_str();
  4.    //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理(纠正:s对象的析构是在对指针c完成赋值操作之后进行的,故此处并没有错误)

应该这样用:

  1.   ];
  2.   ";
  3.   strcpy(c,s.c_str());

这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作
  再举个例子
  c_str() 以 char* 形式传回 string 内含字符串
  如果一个函数要求char*参数,可以使用c_str()方法:

  1.   string s ="Hello World!";
  2.   printf("%s", s.c_str()); //输出 "Hello World!"

c_str在打开文件时的用处:
  当需要打开一个由用户自己输入文件名的文件时,可以这样写:ifstream in(st.c_str());。其中st是string类型,存放的即为用户输入的文件名。

区别:

  1. const value_type *c_str( ) const;
  2.  
  3. const value_type *data( ) const;

data只是返回原始数据序列,没有保证会用traits::eos(),或者说'\0'来作字符串结束.   当然,可能多数实现都这样做了。

c_str是标准的做法,返回的char*   一定指向一个合法的用'\0'终止的C兼容的字符串。   
所以,如果需要C兼容的字符串,c_str是标准的做法,data并不保证所有STL的实现的一致性。

你或许会问,c_str()的功能包含data(),那还需要data()函数干什么?看看源码:

  1. const charT* c_str () const
  2. {
  3.  
  4. )
  5.  
  6. return "";
  7.  
  8. terminate ();
  9.  
  10. return data ();
  11.  
  12. }

原来c_str()的流程是:先调用terminate(),然后在返回data()。因此如果你对效率要求比较高,而且你的处理又不一定需要以\0的方式结束,你最好选择data()。但是对于一般的C函数中,需要以const char*为输入参数,你就要使用c_str()函数。
对于c_str() data()函数,返回的数组都是由string本身拥有,千万不可修改其内容。其原因是许多string实现的时候采用了引用机制,也就是说,有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。详细的解释和实现查看Effective STL的条款15:小心string实现的多样性。
另外在你的程序中,只在需要时才使用c_str()或者data()得到字符串,每调用一次,下次再使用就会失效,如:

  1. string strinfo("this is Winter");
  2. ...
  1. //最好的方式是:
  2. foo(strinfo.c_str());
  3. //也可以这么用:
  4. const char* pstr=strinfo.c_str();
  5. foo(pstr);
  6. //不要再使用了pstr了, 下面的操作已经使pstr无效了。
  7. strinfo += " Hello!";
  8. foo(pstr);//错误!

会遇到什么错误?当你幸运的时候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有一些不可遇见的错误。总之不会是你预期的那个结果。

补充:string是C++类,所以尽量用C++的函数操作string类。对应的是标准C和char *.

2.char*----->string

  1)string s1 = ch;

  2)string str = string(ch);

  3)string str(ch);

  在不是初始化的地方最好还是用assign().

二:char*与CString:

1.CString----->char*:

  1)CString cstr="Hello Word!";

      char* ch=cstr.getbuffer(cstr.length());

2char*----->CString:直接赋值或者格式化即可

  1) CString cStr1 = ch;

  2) CString cStr2 = CString(ch);

  3)CString cStr2(ch);

  但是,如果数组中有中文话,在Unicode环境下就会出现乱码。这时要么进行转换,要么可以如下方法:CString str(ch);或者 CString str = ch.c_str();

3.CString-----> char[100]:

  1)char a[100];

     CString str("aaaaaa");

   strncpy(a,(LPCTSTR)str,sizeof(a));

  2)CString str="aaa";

     char* ch;

   ch=(char*)(LPCTSTR)str;

三:string与CString:

1.string----->CString

   string s,s1,s2,s3;

      CString cstr2,cstr;

  1) str = CString(s); //直接复制丢给构造会自己转换

2) CString cstr(s1.c_str());

  3)cstr2.Format("%s", s2.c_str());

  4)cstr2.Format("%s", s3.data());

2.CString----->string

  CString类型变量可以直接给string类型变量赋值,但是string类型不能对CString类型直接赋值。

  CString cStr = "adsad",cstr3;

  1)string str = cStr;

  2)str=cstr3.GetBuffer(0);  GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.

   str.ReleaseBuffer();

  3)str = LPCSTR(cstr);

https://technet.microsoft.com/zh-cn/w6w3kbaf(zh-tw).aspx

https://technet.microsoft.com/zh-cn/ms235389

附:LPCSTR解释

类型理解
  LPCTSTR类型:
  L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
  P表示这是一个指针
  C表示是一个常量
  T表示在Win32环境中, 有一个_T宏
  STR表示这个变量是一个字符串
详细释义
      这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
  所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。
  在程序中我们大部分时间要使用带T的类型定义。
  LPCTSTR == const TCHAR *(TCHAR is wchar_t )
  CString 和 LPCTSTR 可以说通用。 原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已。
  常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")时, 字符串"abcd"就会根据编译时的是否定一_UNICODE来决定是char* 还是 w_char*。 同样,TCHAR 也是相同目的字符宏。 看看定义就明白了。

string,char*及CString类型的相互转换的更多相关文章

  1. VC中BSTR、Char和CString类型的转换

    1.char*转换成CString 若将char*转换成CString,除了直接赋值外,还可使用CString::format进行.例如: char chArray[] = "This is ...

  2. C++ 中 string, char*, int 类型的相互转换

    一.int 1.int 转换成 string 1) to_string函数 —— c++11标准增加了全局函数std::to_string: string to_string (int val); s ...

  3. MFC/C++/C中字符类型CString, int, string, char*之间的转换

    1 CString,int,string,char*之间的转换 string 转 CString CString.format("%s", string.c_str()); cha ...

  4. CString,string,char*之间的转换(转)

    这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差.string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的:char*是从学习C语 ...

  5. MFC string char cstring 类型转换

    在Unicode环境下用以下转换: CString z_strCurtTime = _T(""); // 获取当前时间 CTime z_tCurTime = CTime::GetC ...

  6. (转)CString,int,string,char*之间的转换

    CString,int,string,char*之间的转换http://www.cnblogs.com/greatverve/archive/2010/11/10/cstring-int-string ...

  7. 【转载】CString,string,char*之间的转换

    本文转自 <> 这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差.string是使用STL时必不可少的类型,所以是做工程时必须熟练掌 ...

  8. C++string,char* 字符数组,int类型之间的转换

    string.int 常见类型之间相互转换 int & string 之间的转换 C++中更多的是使用流对象来实现类型转换 针对流对象 sstream实现 int,float 类型都可以实现 ...

  9. VC CString,int,string,char*之间的转换

    CString转string : CString strMfc = "test"; std::string strStr; strStr = strMfc.GetBuffer(); ...

随机推荐

  1. update t_conference set c_address = replace(c_address,'中华人民共和国','');

    update t_conference set c_address = replace(c_address,'中华人民共和国','中国');      //把c_address字段中的‘中华人民共和国 ...

  2. 337BRoutine Problem

    /*给出你图片的长和宽的比例a:b 和摄像头的比例c:d,然后叫你求最后将图片放进摄像头 以后,剩余的面积比上摄像头的总面积,注意要化简为最简形式,而且摄像头要设置成至少一条边和图片相等 做法:先将两 ...

  3. Makefile解析(最简单的LED)

    ①led_sp.bin: start.o led.o #led_sp.bin是由 start.o 和 led.o 生成 ②arm-linux-ld -Ttext 0x0 -o led_sp.elf $ ...

  4. jz2440-uboot-201204版本移植【学习笔记】【原创】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山二期视频学习笔记 交叉编译工具:arm-linux-gcc (GCC)4.3.2 PC环境:ubuntu18.04 一.uboot ...

  5. System.data.sqlite安装

    在这个页面可以下载安装不同版本的 http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki x86的版本可以在64位机 ...

  6. Flask 5 模板1

    NOTE 1.VF的作用:生成请求的响应.一般来说请求会改变程序的状态,这种变化会在视图函数中产生. eg.用户在网站中注册了一个新账户,用户在表单中输入电子邮件地址和密码,然后提交到服务器,服务器接 ...

  7. iframe与父页面传值

    最近做的项目中用到了不少iframe,而且需要实现: 从父页面获取iframe中某个元素的值或则从iframe页面获取其父页面上某个元素的值. 在网上查询了相关东西,后总结如下: (1)父页面获取if ...

  8. Qt5编译error01

    1.Qt551x86 vs2013 1.1.“error: C2001: 常量中有换行符” 问题还原:源码:“QString str = tr("已接收 %1MB (%2MB/s) \n共% ...

  9. postgresql中终止正在执行的SQL语句

    在Linux系统中可以使用kill [pid]的方式强制删除进程,但对于修改数据表的语句来说,这样可能导致postgresql进入recovery mode,这样会导致锁表. Postgresql的运 ...

  10. 用JavaScript做一个小小设计

    这个项目是我无聊时完成的,参阅过很多大神的示例,其实方法并不难主要是js和css样式的设计,我发现自己还有很多的js代码写不出来更加不用提看的明白了,(PS吐槽一下:革命尚未成功,同志还需努力啊!)此 ...