字符串,wchar_t, char,string,wstring
来源:互联网 发布:jquery1.11.1.js下载 编辑:程序博客网 时间:2024/05/22 09:03
昨天晚上在看字符串的时候觉得有必要整理一下;
(一)首先 看看C++中对(char,wchar_t,TCHAR) 的定义
数据类型char具有双重目的,它指定1字节变量,可以使用这种变量存储给定值域内的整数,或者存储单个ASCII 字符的代码;
char letter = 'A'; //注意这个地方是 单引号;
由于 'A' 是由ASCII 码表示的十进制数的65,因此可以把上一句话写成 char letter = 65;
对于Visual C++ 来说可以存储在char型变量中的整数返回为 -128--127
类型 wchar_t 的叫法源自于宽字节类型(wide character type 适用于unicode编码),这种类型的变量可以存储2字节字符代码,值域为0-65535,
wchar_t letter = L'Z'; //‘Z’前面的L告诉编译器这是一个16位字符代码值; wchar_t letter = 0x5A;
TCHAR是一个宏,在ANSI坏境下定义为char,unicode坏境下定义为wchar_t。
那么 一串字符是组合成单个实体的一系列char型值;
(二)字符数组和字符串
A) char类型的数组被称作字符数组,通常用来存储字符串。字符串是附加有特殊字符(字符串结尾标志 '\0' 占用一字节0x00,其8为全是0)的字符序列,
字符和字符数组区别:
a) char letter = 'A'; //单引号.
b) char name[] = "Albert Einstein"; //双引号.
同理可得 wchar letter = "Albert Einstein"; //不同的编码. (字符串结尾标志 \0' 双字节 0x0000)
B) C++ 提供了两种字符串的表示方法:1) c风格的字符串 2) 标准c++引入的string类类型。
1) c风格的字符串:
c风格的字符串存储在一个字符数组中,一般通过一个char *类型指针操纵它。系统内部实际上是存储在一个字符串数组中,然后,p 指向数组的第一个元素:
char *p = ”Albert Einstein”;
wchar_t *p = ”Albert Einstein”;
可以看出p实质就是一个指针,指向一个字符型数组首地址;
char p_str[] = ”Albert Einstein”;
p = p_str;
我们看看常见的几个宏:(这里借鉴别人的例子)
(例) 一个字符串,比如说"北京2008",对应ANSI编码表示为 const char * cha = "北京2008"; unicode编码表示为 const wchar_t * wcha = L"北京2008"; 。
在内存里以二进制存储,ANSI编码对应为 0x B1B1 BEA9 32 30 30 38,unicode编码为 0x 1753 AC4E 3200 3000 3000 3800。
有了这个例子,对于宏
const TCHAR *可以用来在不同的环境下表示字符串;
LPSTR : long point string, 相当于char *;
LPCSTR: long point const string, 相当于 const char *;
LPCWSTR: long point const wide string, 相当于 const wchar_t *;
LPCTSTR: 类似的,相当于 const TCHAR *;
2)字符串类型String 类
C++标准库对此进行支持。
使用string类,必须包含头文件: #include<string>
在C++标准里定义了两个字符串string和wstring
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
string str = "Albert Einstein";
wstring wstr = L"Albert Einstein";
//可以把一个c风格的字符串转换成string类对象
char * p;
string str = p;
//把String 类对象转换成 C风格字符串
const char* p= str.c_str();
但是对于 unicode 编码的字符串:就得采用先转换为string 或者 char*
wstring转换为string:
wstring wstr=_T("这个世界很奇怪");
int size=WideCharToMultiByte(CP_ACP,0,wstr.c_str(),-1,NULL,0,NULL,NULL);
char *ch=new char[size+1];
if(!WideCharToMultiByte(CP_ACP,0,wstr.c_str(),-1,ch,size,NULL,NULL))
{
return false;
}
string str=ch;
wchar_t*转换为char*:
wchar_t *wch=_T("这个世界很奇怪");
int size=WideCharToMultiByte(CP_ACP,0,wch,-1,NULL,0,NULL,NULL);
char *ch=new char[size+1];
if(!WideCharToMultiByte(CP_ACP,0,wch,-1,ch,size,NULL,NULL))
{
return false;
}
然后再利用 string 和 char* 之间的关系进行转换;
到此就介绍完C++中关于字符的基本知识;
下一篇会介绍字符的运用;
- 字符串,wchar_t, char,string,wstring
- C++ string 、char 、char *、wstring、wchar_t * 、wchar_t 之间的转换
- Relationship: char, wchar_t, TCHAR, _T(), wstring, string
- Relationship: char, wchar_t, TCHAR, _T(), wstring, string
- wstring->string 文件读写 char->wchar_t
- wchar_t char string wstring 之间的转换
- wchar_t char string wstring 之间的转换
- C++ wstring string char* wchar_t相互转换
- wchar_t char string wstring 相互转换
- wchar_t char string wstring 之间的转换
- String/WString, char* /wchar_t* 相关操作函数
- C++ Various String Types (char, wchar_t, string, wstring, cstring)
- wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString....转换
- wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString 以及system("command")
- std::string,std::wstring,CString,char,char*,char数组,wchar_t*,wchar_t,wchat_t数组
- wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString
- wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString....转换
- wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CStrin
- UVA 11008 Antimatter Ray Clearcutting
- Android常见错误处理
- C# GDI+简单绘图
- 状态机的两种写法
- 跟我一起写Mafefile(后记)
- 字符串,wchar_t, char,string,wstring
- 使用nohup在后台运行scp
- Java 匿名内部类的示例介绍
- SQL语句优化技术简要分析
- Qt 动画详解一
- Handler的用法
- 按时间分段汇总
- Spring2.x中设置Bean的作用域
- UE正则表达式语法及常用语句