string
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
#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);
}
字符类型
- char: ASCII, Use for ASCII characters in older C-style strings or std::string objects that will never have to be converted to UNICODE.
- wchar_t: UNICODE characters, This is the character type that is used in strings of type std::wstring.
- unsigned char: C++ has no built-in byte type. Use unsigned char to represent a byte value.
- std::string (for 8-bit char-type character strings) or std::wstring (for 16-bit wchar_t-type character strings): #include
- 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函数。