
基础知识
1.自Windows NT起,Windows的所有版本都完全用Unicode来构建。也就是说,所有核心函数(创建窗口、显示文本、进行字符串处理等等)都需要Unicode字符串。
2.在Windows Vista以及后续系统版本中,每个Unicode字符都使用UTF-16编码,UTF全称是Unicode Transformation Format(Unicode转换格式)。UTF-16将每个字符编码为2个字节(或者说16位)。
3.C运行库中任何修改字符串的函数都存在一个安全隐患:如果目标字符串缓冲区不够大,无法容纳所生成的字符串,就会导致内存中的数据被破坏(memory corruption)。
4.strcpy和wcscpy函数(以及其他大多数字符串处理函数)的问题在于,它们没有收到指定了缓冲区最大长度的参数。
5.为了写安全的代码,我们应该放弃这些熟悉的、能修改字符串的C运行库函数(不过,strlen、wcslen和_tcslen等函数是没有问题的,因为它们不会修改传入的字符——即使它们假设字符串是以0来终止的,而这个假设有时并不一定成立)。
6.新的安全字符串函数,在应用程序中包含StrSafe.h时,String.h也会被包含进来。C运行库中现有的字符串处理函数(如_tcscpy宏后的那些函数)已被标记为废弃不用。现有的每一个函数(如_tcscpy或_tcscat),都有一个对应的新版本的函数。前面的名字相同,但最后添加了一个_s(代表secure)后缀。
常用函数
我们经常都要比较字符串以进行相等性测试或进行排序。
最理想的函数是CompareString(Ex)和CompareStringOrdinal。
1.CompareString(Ex)函数:比较需要以符合用户语言习惯的方式向用户显示的字符串
1 2 3 4 5 6 7 8 |
int CompareString( _In_ LCID Locale, _In_ DWORD dwCmpFlags, _In_ LPCTSTR lpString1, _In_ int cchCount1, _In_ LPCTSTR lpString2, _In_ int cchCount2 ); |
2.CompareStringOrdinal函数:比较程序内部所用的字符串(如路径名、注册表项/值、XML、元素/属性等)
1 2 3 4 5 6 7 |
int CompareStringOrdinal( _In_ LPCWSTR lpString1, _In_ int cchCount1, _In_ LPCWSTR lpString2, _In_ int cchCount2, _In_ BOOL bIgnoreCase ); |
本文链接地址: Windows via C/C++ Chapter 2 : 字符和字符串
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
如果您愿意为文章的内容或想法提供支持,欢迎点击下边的捐赠按钮,资助作者创作更多高价值高品质的内容。