1、宽窄字符串类型指针的定义:
● 窄字节:char *p_str = "hello";
● Unicode宽字节:wchar_t *p_wstr = L"hello";
● 通用类型:TCHAR *p_tstr = _T("hello"); 或者 TCHAR *p_tstr= _TEXT("hello");
● 动态申请内存:TCHAR *pszBuf = new TCHAR[100];
其中,_TEXT 和 _T 是一样的,定义如下:
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
来看看 __T 的最终定义:
#ifdef _UNICODE
#define __T(x) L##x
#else
#define __T(x) x
#endif
其中,##为连接的意思。
2、常用的宽窄字节字符串处理函数:
字符串长度:
● Ansi:strlen(char *str);
● Unicode:wcslen(wchar_t *str);
● 通用函数:_tcslen(TCHAR *str);
● Ansi:int atoi(const char *str);
● Unicode:int _wtoi(const wchar_t *str);
● 通用函数:_tstoi(const TCHAR *str);
字符串拷贝:
● Ansi:strcpy(char *strDestination, const char *strSource);
● Unicode:wcscpy(wchar_t *strDestination, const wchar_t *strSource);
● 通用函数:_tcscpy(TCHAR *strDestination, const TCHAR *strSource);
以上函数不安全,在vs2003等以上版本的编译器中会有warnning警告提示,以下为安全函数(VC++6.0不支持):
● Ansi:strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource);
● Unicode:wcscpy_s(wchar_t *strDestination, size_t numberOfElements, const wchar_t *strSource);
● 通用函数:_tcscpy_s(TCHAR *strDestination, size_t numberOfElements, const TCHAR *strSource);
numberOfElements
Size of the destination string buffer. 目的缓冲区的大小,以字节为单位,不是字符!
size_t unsigned integer,在MSDN中的解释:Result of sizeof operator,也就是说 size_t 是 unsigned integer 即无符号整数。那为什么会有size_t这个类型呢?
因为不同平台的操作系统(32/64)中 int/long 等类型所占的字节并不一样,而 size_t 在不同的平台下有不同的定义。有点类似于TCHAR类型:
#ifndef _SIZE_T_DEFINED
#ifdef _WIN64
typedef unsigned __int64 size_t; //8个字节,64位
#else
typedef _W64 unsigned int size_t; //4个字节,32位
#endif
#define _SIZE_T_DEFINED
#endif
3、sizeof 求宽窄字节字符串的注意事项:
char* p_str = "hello";
我想求这个字符串所占用的字节数:sizeof(p_str) 肯定是错误的!
strlen(p_str) + 1,实际上就是 p_str 指针指向的字符串所占用的空间对吧?因为本身1个char占用1个字节的存储空间,所以默认字符串的长度加上字符串的结束符 \0 就是字符串所占用的字节数。
那么宽字节呢?wchar_t* p_wstr = L"hello";
他占用的字节数应该如何来求?
wcslen(p_str) + 1 这个对吗?当然也是不对的,正确的是:(wcslen(p_str) + 1) * sizeof(wchar_t)
通用类型:TCHAR* p_tstr = _T("hello");
(_tcslen(p_tstr) + 1) * sizeof(TCHAR)
应用在哪里呢?比如:
TCHAR *pszBuf = new TCHAR[100];
定义完了之后,我要给这个字符串数组清空,于是我应该这么做:
memset(pszBuf, 0, 100 * sizeof(TCHAR)) 这样做是最安全的,不管当前的 TCHAR 是 char 也好,是 wchar_t 也好,都可以满足。
相关文章
- 03-18使用STM32的CUBEMX库来驱动OLED(128x64)(128x32)(SSD1306)含库U8g2库
- 03-182021-02-17:规定1和A对应、2和B对应、3和C对应...26和Z对应,那么一个数字字符串比如“111”就可以转化为:“AAA“、“KA“和“AK“。给定一个只有数字字符组成的字符串str,请
- 03-18Python: 字符串格式化format()函数的使用
- 03-182:宽窄字节字符串的使用
- 03-18python – 使用字符串subs(‘x’,’w’)代替符号subs(x,w)的Sympy替换
- 03-18Python2和Python3中的字符串编码问题解决
- 03-18使用sympy评估带有数字表达式的字符串?
- 03-18游戏开发中的物理之使用KinematicBody2D
- 03-18Struts2与EasyUI整合时,对于Exception异常的处理,返回含错误信息的JSON字符串
- 03-18字符串的基本使用