char、wchar_t、char8_t、char16_t、char32_t

char, wchar_t、char8_t、char16_t、char32_t都是内置数据类型,无需头文件即可使用。使用字符常量时,理论上都需要前缀表示字符存储宽度。但是默认的char可以省略。

char     ch1{ 'a' };  // or { u8'a' }
wchar_t  ch2{ L'a' };
char16_t ch3{ u'a' };
char32_t ch4{ U'a' };

字符串宽度函数

需要引用string.h头文件

#include <string>
strlen()
wcslen()

TCHAR

TCHAR和_T()可以根据编译器自动匹配char还是wchar_t,_tcslen同样也会匹配strlen或wcslen,这两个宏在头文件tchar.h中。TEXT()宏在头文件中windows.h定义。 #include TCHAR xxx[]= _T("hello\n"); int z = _tcslen(xxx);

#include <windows.h>
TCHAR xxxx[] = TEXT("hello\n");

std::string & std::wstring

如果使用=,那么使用的是拷贝初始化,如果使用的(),那么使用过的是直接初始化。

string s1;  //空字符串
string s2=s1; //s2是s1的副本
string s3="Hello"; //s3是"Hello"的副本 = string s3("hello");
string s4(10, 'c') //s4的内容是"cccccccccc"

const char* ptr = char const *ptr

定义一个指向字符常量的指针ptr,不可以通过prt修改这个字符串,但不意味着这个字符串确实不可以修改,只是不能通过这个指针去修改。prt指针不是常量,可以重复赋值指向其它指针。

char * const ptr

定义一个指向字符的指针常数,即const指针,不能修改ptr指针,但是可以修改该指针指向的内容。

const char* const

既不能改变值,又不能指向别的变量

strcat & strncat

C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。需要确保dest足够长。

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char src[50], dest[50];
 
   strcpy(src,  "This is source");
   strcpy(dest, "This is destination");
 
   strcat(dest, src);
 
   printf("最终的目标字符串: |%s|", dest);
   
   return(0);
}

字符类型

  1. char: ASCII, Use for ASCII characters in older C-style strings or std::string objects that will never have to be converted to UNICODE.
  2. wchar_t: UNICODE characters, This is the character type that is used in strings of type std::wstring.
  3. unsigned char: C++ has no built-in byte type. Use unsigned char to represent a byte value.
  4. std::string (for 8-bit char-type character strings) or std::wstring (for 16-bit wchar_t-type character strings): #include
  5. CString: MFC or ATL

TEXT(“Hello World”) & TCHAR

使用TEXT宏,会自动根据项目配置的多字节(Multi-Byte Character Set)还是宽字节(Unicode Character Set)自动转换字符串。TCHAR类似,但是用于字符。TEXT,_TEXT 和_T 一样的。

//Multi-Byte Character Set
char p[100] = "aaaa";
int n = 0;
n = strlen(p);

//Unicode Character Set
wchar_t p2[100] = L"bbbb";
int m = wcslen(p2);

//以下三行代码,第一句话在定义了UNICODE时会解释为第三句话,没有定义时就等于第二句话。但二句话无论是否定义了UNICODE都是生成一个ANSI字符串,而第三句话总是生成UNICODE字符串。
TCHAR szStr1[] = TEXT("str1");   
char szStr2[] = "str2";   
WCHAR szStr3[] = L("str3");   

L”readyHandle\n”

字符串前面加L表示该字符串是Unicode字符串。

strlen("asd") = 3;   
strlen(L"asd") = 6;  

wchar_t, WCHAR

typedef unsigned short wchar_t;
typedef wchar_t WCHAR; 

CString转为char*

CString str(TEXT("Hello World"));
CStringA strA(str);
char* strC = strA.GetBuffer();

CString to string

  • CT2A 、CA2T 在Unicode 字符集下为 CW2A 、CA2W,在Muti-Byte字符集下都为 CA2A。
  • CW2A 将宽字符集(Unicode)转化为多字符集(ASCII)
  • CA2W 将多字符集(ASCII)转化为宽字符集(Unicode)
  • C:convert
  • W:宽字符串,也就是 UNICODE
  • 2:to
  • A:ANSI 字符串,也就是 Muti-Byte。
  • T : 中间类型,如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A

    CString cstrTest = _T(“test”); string strTest; string = CT2A(cstrTest.GetString());

    string strTest=”test”; CString cstrTest; cstrTest= CA2T(strTest.c_str());

strlen & wcslen

如果需要计算Unicode的字符串,需要使用wcslen函数。