zoukankan      html  css  js  c++  java
  • 蛋疼的字符类型与操作

     

    转自: http://www.cnblogs.com/magic-cube/archive/2011/05/12/2044713.html

     

    .类型简介

    1. wchar_twchar_tc++中用来表示宽字节的数据类型,即unicode编码的数据类型

    char   charc中的字符数据类型,属于ASCII编码。

     

    2: TCHARTCHAR有二意性,其定义为:

    #ifdef UNICODE

    typedef wchar_t  TCHAR

    #else

    typedef char     TCHAR

    #endif

    也就是说,如果我们使用unicode编码,那么TCHAR指的就是wchat_t,如果我们使用的是ASCII编码,那么TCHAR指的就是char,这样处理的目的是为了程序的可移植性。T表示在Win32环境中, 有一个_T宏 。

     

    3.WCHAR WCHAR其实也是一个宏,表示的就是wchar_t,为了书写方便重新定义的一个宏而已,其定义为:

    typedef wchat_t WCHAR

     

    4.CString动态的TCHAR数组。所以有二义性.它是一个完全独立的类,封装了“+”等操作符和字符串操作方法,换句话说就是CString是对TCHAR操作的方法的集合。

     

    5.LPCTSTR常量的TCHAR指针.

    typedef const TCHAR* LPCTSTR

     

    L:   表示long指针,是为了兼容的作用。没有实际意义。

    P:   表示这是一个指针

    C:   表示是一个常量

    T:   表示在Win32环境中, 有一个_T

    STR: 表示这个变量是一个字符串

    6.LPTSTRTCHAR指针,其定义为

    typedef TCHAR* LPTSTR

     

    LPT的含义同上。

     

    7: msdn上给出的定义:

     

    type         Meaning in MBCS builds     Meaning in Unicode builds

    WCHAR        wchar_t                    wchar_t

    LPSTR        char*                      char*

    LPCSTR       const char*                const char*

    LPWSTR       wchar_t*                   wchar_t*

    LPCWSTR     const wchar_t*             const wchar_t*

    TCHAR       char                       wchar_t

    LPTSTR       TCHAR*                     TCHAR*

    LPCTSTR      const TCHAR*               const TCHAR*

     

    8.stringstringc++中的字符串变量,因为操作c类型的char非常麻烦,而且很容易出现内存泄漏,所以c++就对c中的char 进行了封装,其中

    包含赋值,删除,增加等常用操作,这些操作都不用考虑内存,为了使用更加方便,所以能使用string就尽量使用,必须包含其头文件

    #include <string>

    注意不是:

    #include <string.h>

    因为string.hC字符串头文件

     

    string中常用的函数有:

    1: =, assign()               //赋以新值

    2: swap()                    //交换两个字符串的内容

    3: +=,append(),push_back()   //在尾部添加字符

    4: insert()                  //插入字符

    5: erase()                   //删除字符

    6: clear()                   //删除全部字符

    7: replace()                 //替换字符

    8: +                         //串联字符串

    9: ==,!=,<,<=,>,>=,compare() //比较字符串

    10: size(),length()          //返回字符数量

    11: max_size()               //返回字符的可能最大个数

    12: empty()                  //判断字符串是否为空

    13: capacity()               //返回重新分配之前的字符容量

    14: reserve()                //保留一定量内存以容纳一定数量的字符

    15: [ ], at()                //存取单一字符

    16: >>,getline()             //stream读取某值

    17: <<                       //将谋值写入stream

    18: copy()                   //将某值赋值为一个C_string

    19: c_str()                  //将内容以C_string返回

    20: data()                   //将内容以字符数组形式返回

    21: substr()                 //返回某个子字符串

    22:                          //查找函数

    23: begin() end()            //提供类似STL的迭代器支持

    24: rbegin() rend()          //逆向迭代器

    25: get_allocator()          //返回配置器

     

    .相互转化

    既然有定义了这么多的数据类型,所以他们之间的相互转化是少不了的

    CStringLPCTSTR的转化

    CStringLPCTSTR不需要转化,两者是等价的,所以

    CString str("cstring");

    LPCTSTR pcStr = str;

     

    2.CStringLPTSTR的转化:

    下述转法虽然可以,但是却不安全:

    CString str("string");

    LPTSTR pStr = (LPTSTR)(LPCTSTR)(str);

    因为本来转化后的字符串变得可以修改了,造成了安全隐患。

    正确的转化方法为:

     

    CString str("string");

    LPTSTR pStr = str.GetBuffer();

    str.ReleaseBuffer();

    注意:GetBuffer()ReleaseBuffer()之间不可以调用任何的CString函数,比如GetLength()函数,因为无法预测对内存的操作,所以任何CString函数得到的结果都是不确定的。

     

    3.CStringWCHAR*(wchar_t*)的转化

    方法一:使用wcscpy()函数

    CString str("string");

    WCHAR pWchar[100];

    wcscpy(pWchar,str);

     

    方法二:使用wcscpy_s()函数

    CString str("string");

    WCHAR pWchar[100];

    wcscpy(pWchar,100,str);  //指定了长度

     

    方法三:使用_tcscpy()函数

    CString str("string");

    WCHAR pStr[100];

    _tcscpy(pStr,str);

     

    方法四:使用_tcscpy_s()函数

    CString str("string");

    WCHAR pStr[100];

    _tcscpy_s(pStr,100,str);  //指定了长度

     

    4.CStringchar*的转化

    方法一:使用wcstombs()函数

    CString str("string");

    char pChar[100];

    wcstombs(pChar,str,100);

     

    方法二:使用wcstombs_s()函数

    同上面一样,wcstombs_s()wcstombs()的安全版本:

     

  • 相关阅读:
    sublime使用
    eclipse导入工程中文乱码
    npm 代理
    栈和堆
    Linux常用命令大全
    Google云开启SSH登录方法
    景安快运挂在磁盘-支持宝塔
    discuz 批量删除回复并且保留主题的方法,亲测3.4版本通过
    博客园去掉页面的广告的方法
    WordPress忘记后台登录地址时怎么办?万能登录地址
  • 原文地址:https://www.cnblogs.com/w413133157/p/2238116.html
Copyright © 2011-2022 走看看