VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1308|回复: 25

《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用

[复制链接]
51_avatar_middle
online_admins 发表于 2018-12-14 00:05:59 | 显示全部楼层 |阅读模式
上节课已经给大家详细的讲解了宽窄字节的相关类型,这节课就来教大家如何来用!

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 也好,都可以满足。

4、小作业:
熟练使用常用的字符串处理函数进行处理,大家课后多多练习!

备注:相关课程细节及演示详见视频教程!


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程在线观看地址:
https://www.bilibili.com/video/av38413272/?p=2
MP4高清视频下载地址:链接:https://pan.baidu.com/s/1zqqwZ6KKpQs5BpjEbF_3nw 提取码:us4j
本节课件下载(回复后可见):
游客,如果您要查看本帖隐藏内容请回复

备注:VIP会员可免费下载本站所有资源(点击查看)
提示:通过购买VC驿站U盘打包(点击查看)也可加入终身Vip会员^_^




上一篇:《实用VC编程之玩转字符串》第1课:宽窄字节的区别及重要性
下一篇:《实用VC编程之玩转字符串》第3课:宽窄字节字符串的转换
81_avatar_middle
在线会员 发表于 2018-12-14 21:20:23 | 显示全部楼层
期待期待。。。《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用
08_avatar_middle
在线会员 发表于 2018-12-16 10:46:36 | 显示全部楼层
《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用
87_avatar_middle
在线会员 发表于 2018-12-16 13:00:42 | 显示全部楼层
谢谢老大分享!
69_avatar_middle
在线会员 发表于 2018-12-16 20:16:57 | 显示全部楼层
《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用谢谢楼主分享
10_avatar_middle
在线会员 发表于 2018-12-17 16:22:40 | 显示全部楼层
继续学习,感谢分享。
04_avatar_middle
online_vip 发表于 2018-12-19 21:36:39 | 显示全部楼层
老大辛苦了,谢谢
78_avatar_middle
在线会员 发表于 2018-12-20 08:38:56 | 显示全部楼层
好教程下载学习
95_avatar_middle
在线会员 发表于 2018-12-21 08:34:57 | 显示全部楼层
感谢老大分享
21_avatar_middle
在线会员 发表于 2018-12-22 11:24:23 | 显示全部楼层
老大辛苦了,谢谢
87_avatar_middle
online_vip 发表于 2018-12-24 11:14:38 | 显示全部楼层
不管当前的 TCHAR 是 char 也好,是 wchar_t 也好,都可以满足。
01_avatar_middle
online_vip 发表于 2018-12-29 10:22:01 | 显示全部楼层
老大出品,必属精品
49_avatar_middle
在线会员 发表于 2018-12-31 09:55:17 | 显示全部楼层
下载看看学习学习
22_avatar_middle
在线会员 发表于 2018-12-31 20:36:09 | 显示全部楼层
《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用
61_avatar_middle
在线会员 发表于 2019-1-2 01:34:36 | 显示全部楼层
谢谢老大分享!
89_avatar_middle
在线会员 发表于 2019-1-15 19:15:45 | 显示全部楼层
看下示例代码
89_avatar_middle
在线会员 发表于 2019-1-21 19:13:35 | 显示全部楼层
Size of the destination string buffer. 目的缓冲区的大小,以字节为单位,不是字符!

实际上该参数就是使用的字符数量,不论你是char 还是 wchar_t (如果你写的是字节数的话,后面的内存会被覆盖的)《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用
98_avatar_middle
在线会员 发表于 2019-2-23 09:58:07 | 显示全部楼层
谢谢分享
继续学习
40_avatar_middle
在线会员 发表于 2019-2-25 12:51:42 | 显示全部楼层
谢谢分享!!
80_avatar_middle
在线会员 发表于 2019-3-3 20:48:42 | 显示全部楼层
RE: 《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用 [修改]
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-4-26 04:50

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表