zoukankan      html  css  js  c++  java
  • 《Windows核心编程》学习笔记(0)字符串

    Windows定义的Unicode数据类型有:

      WCHAR                     Unicode字符

      PWSTR                     指向Unicode字符串的指针

      PCWSTR                    指向一个恒定的Unicode字符串的指针

    相对应的ANSI数据类型有:

      CHAR                      ANSI字符

      PSTR                     指向ANSI字符串的指针

      PCSTR                    指向一个恒定的ANSI字符串的指针

    通用的字符数据类型:

      TCHAR

      PTSTR

      PCTSTR

     

    其 中TCHAR的定义位于类TChar.h中,需要定义宏_UNICODE才能调用unicode数据类型。 PTSTR,PCTST的定义位于 Windows.h头文件中,需要定义宏UNICODE才能调用unicode数据类型。因此当同时调用windows.h和TChar.h文件且需要用 到unicode编码时,需要同时定义宏_UNICODE和宏UNICODE。

     

    注:

    1.为了程序的兼容性,一般调用通用字符类型。并且建议最好使用操作系统函数,而不要使用C运行期字符串函数。这将有助于稍稍提高你的应用程序的运行性能。

    2.当将字符串地址附值给TCHAR指针变量时需要的格式为

    TCHAR* pszError = _TEXT("error");

    因为如果不加_TEXT,默认“"error"为ANSI编码.

    3. 当为用户提供dll链接库时需要定义一套既适合unicode又适合ANSI的代码。一般是在ANSI的函数中将ANSI的参数转换为UNICODE的参 数再调用UNICODE的函数。如windows提供的函数CreateWindowExA和CreateWindowExW。另外Windows还定义 了一个宏CreateWindowEx,其定义如下:

    #ifdef unicode

    #define CreateWindowEx CreateWindowExW

    #else

    #define CreateWindowEx CreateWindowExA

    #endif

    4. 当计算字符个数时应该调用sizeof(szBuffer)/sizeof(TCHAR),而不是sizeof(szBuffer),分配内存时应该调用 malloc(nCharacters *sizeof(TCHAR)), 而不是调用malloc(nCharacters )。

    5._countof宏可获得字符串的字符数,sizeof可获得字符串的字节数。

    1. 为了兼容性可以调用以下函数来处理字符:

      lstrcat 将一个字符串置于另一个字符串的结尾处
        lstrcmp 对两个字符串进行区分大小写的比较
        lstrcmpi 对两个字符串进行不区分大小写的比较
        lstrcpy 将一个字符串拷贝到内存中的另一个位置
        lstrlen 返回字符串的长度(按字符数来计量)

    PTSTR CharLower(PTSTR pszString)

    PTSTR CharUpper(PTSTR pszString)

    DWORD CharLowerBuff(PTSTR pszString,DWORD cchString)

    DWORD CharUpperBuff(PTSTR pszString,DWORD cchString)

    BOOL IsCharAlpha(TCHAR ch);

    BOOL IsCharAlphaNumeric(TCHAR ch)

    BOOL IsCharLower(TCHAR ch)

    BOOL IsCharUpper(TCHAR ch)

    sprintf(PTSTR, PTSTR, PTSTR)

    注: (1).CharLower,CharUpper,CharLowerBuff,CharUpperBuff这几个函数还可以用来处理一个字符,方法如下:TCHAR cLowerCaseChar= CharLower((PTSTR)szString[0])

         (2).CharUpper 和CharUpperBuff的区别是charUpperBuff用于处理缓冲区的数据(该缓冲区不必以0结尾)

         

    2其他函数:

    DWORD IsTextUnicode(CONST PVOID pvBuffer,int cb, PINT pResult);(此函数用于判断文本文件的编码类型)

    int WideCharToMultiByte(UINT uCodePage, DWORD dwFlags,PCWSTR pWideCharStr,

        int cchWideChar,PSTR pMultiByteStr,int cchMultiByte,PCSTR  pDefaultChar,PBOOL pfUDC)

    int MultiByteToWideChar(UINT uCodePage, DWORD dwFlags,PSTR pMultiByteStr,

        int cchMultiByte,,PCWSTR pWideCharStr,int cchWideChar)

    函数MultiByteToWideChar的使用方法:

    1) 调用MultiByteToWideChar函数,为pWideCharStr参数传递NULL,为cchWideChar参数传递0。
        2) 分配足够的内存块,用于存放转换后的Unicode字符串。该内存块的大小由前面对MultiByteToWideChar的调用返回。
        3) 再次调用MultiByteToWideChar,这次将缓存的地址作为pWideCharStr参数来传递,并传递第一次调用MultiByteToWideChar时返回的        缓存大小,作为cchWideChar参数。
        4) 使用转换后的字符串。
        5) 释放Unicode字符串占用的内存块。

    3.安全字符串函数

    C运行库中现有的字符串处理函数(如_tcscpy宏后面的那些函数)已被标记废弃不用。如果使用了这些函数,编译器就会发出警告。

    取而代之的是安全字符串函数,例如:

    errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );

    errno_t strcat_s( char *strDestination, size_t numberOfElements, const char *strSource );

    这些安全的字符串函数在将一个可写的缓冲区作为参数传递时,必须同时提供他的大小。这个值应该是一个字符数。通过对缓冲区使用_countof宏(在stdlib.h中定义),我们很容易计算出这个值。

    ps:1.使用上面这些安全的字符串函数的时候必须包含头文件StrSafe.h。同时String.h也会自动被包含进来。

        2.必须包含其他所有文件之后才包含StrSafe.h。

  • 相关阅读:
    在operator =中要处理“自我赋值”
    delete指针以后应赋值为NULL
    【转】C++对成员访问运算符->的重载
    【转】浅析SkipList跳跃表原理及代码实现
    【KakaJSON手册】05_JSON转Model_05_动态模型
    【KakaJSON手册】04_JSON转Model_04_值过滤
    【KakaJSON手册】03_JSON转Model_03_key处理
    【KakaJSON手册】02_JSON转Model_02_数据类型
    【KakaJSON手册】01_JSON转Model_01_基本用法
    利用eclipse调试JDK源码
  • 原文地址:https://www.cnblogs.com/forlina/p/2174510.html
Copyright © 2011-2022 走看看