浅谈c-string(char或者wchar_t),std::string和CString之间的转换

来源:互联网 发布:千兆有线端口什么意思 编辑:程序博客网 时间:2024/06/05 08:39

   依稀记得,最早开始看CSDN的博客是看到pongba谈到关于c++中异常的使用,里面涉及了对于异常和Errorcode这两种在c++程序中常见的手法的详尽讨论,一直看到关于对写作本身的讨论,觉得深为认同。我一直没有什么写技术文章的习惯,不如就从现在开始吧,所写内容主要是对自己学习和成长历程的一个记录,有错误的地方,还希望大家不吝指出。 

   1、多字节字符集模式(又称为ANSI字符集

      a). string -> c-string:使用string的成员函数c_str()即可换反一个const char*指针,该成员函数以这种方式返回一个c-string形势的字符串(也即:包含'/0'结束符),另外std::string

有一个data()成员函数,该函数返回也是返回一个const char*指针,区别是,该指针指向的字符串并不追加一个'/0'. (不过,我测试的时候,发现在微软实现的STL库的string中(vs2008),即使用data()函数返回,仍然会包含一个‘/0’,知道更具体原因的欢迎指出)

 

      b). c-string -> string:  我们只需要根据情况(是追加还是新增)来调用string的对应成员函数, append()对应追加的,assign()对应新增的. 注意,这里使用=和+=也是可以的,只不过出于对错误查找的考虑,在一般情况下建议不使用重载的运算法(否则可能因为一个小小的失误而导致你的编译器报错的时候出现大量的=号。如果刚好你又不记得这个操作曾经发生在你操作了一个stl对象的时候,您会一脸迷茫的:)),当然,这绝不是说不能使用运算符的方式,相反,有些时候,你必须使用运算符的方式来完成转换, 这个例外就是当你准备追加或者赋值的是一个single char时,此时必须使用+=或者=来完成操作。 [注意,当需要用到格式化输入的时候,即:sprintf,应该使用一个char buffer来充当临时变量,而不是使用string::c_str()直接做为接收缓冲区的参数]

      c). c-string -> CString 和string的操作类似,CString包含了一个Format(),不过该函数的功能更加强大,它的使用和c下面的传统sprintf()很像,也是一个变参函数,第一个字符串给出后面要输入的数据的类型,后面的参数给出具体要输入的数据,这里就不多展开了.

      d). CString -> c-string 和string类似,我们可以使用GetBuffer()成员函数得到CString中的data,用GetLength()得到data的长度(注意,不包含'/0')。至于最后通过什么方式拷贝到char[]中,则是个人选择了,memcpy(),strcpy()或者类似函数均可。[注意:当调用了GetBuffer()以后,一定要记得调用ReleaseBuffer()释放]。

      e). CString -> string  在ANSI字符模式下,可以直接将一个CString扔进string的assign()或者append()中,不需要做出特别的转换(当然背后会有隐式转换发生)。当然也可以调用GetBuffer()提取,assign()或者append()后,使用ReleaseBuffer()释放。

      f). string -> CString  如果是追加的话,可以直接使用CString的Append()完成(string需调用c_str()作为输入参数),如果是赋值的话,我们仍然可以使用Format()函数完成,使用方法同上,不再赘述.

   2、Unicode字符集模式

      其实大多数的转换操作和ANSI模式是类似的,只不过本模式下,由于CString的模版参数定义为TCHAR,该宏在unicode模式下对应wchar_t(宽字符)类型,所以为了减少转化,c-string的字符建议使用TCHAR[]类型来替代char[]类型,这个建议的另一个原因是,很多windows的API都是基于Unicode,使用TCHAR[]将在一定程度上提高效率。另外,string也有一种unicode模式下的形式:xstring, 可以使用一组预定义宏来保证在ANSI和Unicode模式下string"形式上"的统一性。

       如果非要使用char和string,那么必须借用两个系统函数:MultiByteToWideChar(), WideCharToMultiByte()来实现转换。下面我简单的封装了下,作为这两个函数使用的参考:

       eg: 

        

       为了方便,我使用了string和wstring作为参数,大家实际使用时可根据情况调整。 

原创粉丝点击