Windows 编 程中的字符串
(1)在win32编程中,如何使用string类型
#include <string>
using namespace std; LPTSTR lpCmdLine = L"hello world";
string cmd = lpCmdLine;
(2)字符格式基础:
传统的ansi字符在C语言中用char数据类型表示(1字节)。在源代码中声明一个字符串,则编译器会转换为由8位char数据类型构成的一个数组(以"/0"结尾)
char c='a';//一个8位的字符
char szbuffer[100]="a string";//含有99个8位字符和1个8位结束符(/0)的数组
微软的c/c++编译器为unicode定义了一个内建的数据结构,wchar_t,它表示一个16位的unicode(UTF-16)字符。
wchar_t c=L'a';//一个16位的字符
wchar_t szbuffer[100]=L"a string";//含有99个16位字符和1个16位结束符(/0)的数组
字符串比较函数:
if (_stricmp("hello world", cmd.c_str()) == 0){
}
lstrcmp 对两个字符串进行区分大小写的比较
lstrcmpi 对两个字符串进行不区分大小写的比较
(3)C运行库中的安全字符串处理函数
通常,修改字符串的函数都存在一个安全隐患,即目标字符串的缓冲不够大,则会导致内存中的数据被破坏。
例如:
WCHAR szbuffer[3]=L"";
wcscpy(szbuffer,L"abc");
以上的例子是以0结尾的,需要szbuffer[4]才可以容纳。但编译时并不会有任何报错或警告。
针对以上问题,我们必须使用“安全字符串处理函数”,这一类的函数以_s结尾(secure之意),我们来看一下这类函数的原型.
PTSTR _tcscpy(PTSTR strDestination,PCTSTR strSource);
errno_t _tcscpy_s(PTSTR strDestination,size_t numberOfCharacters,PCTSTR strSource);
PTSTR _tcscat(PTSTR strDestination,PCTSTR strSource);
errno_t _tcscat_s(PTSTR strDestination,size_t numberOfCharacters,PCTSTR strSource);
可以看到,在将一个缓冲区作为目标缓冲区时,必须提供这个缓冲区的大小(可容纳的字符个数),通过调用_countof宏计算出来。
这个缓冲区大小参数的主要任务就是验证缓冲区是否足以容纳结果数据.
现在,我们调用这些安全函数的时候,就可以检查返回的errno_t值。只有返回S_OK值,才表明函数调用成功。其他的值可以参照errno.h中的定义。
来看一个例子:
TCHAR szbuffer[3]=L"";
_tcscpy_s(szbuffer,_countof(szbuffer),_T("abc"));
执行完后, szbuffer的第一个字符被设置为'/0',而其他所有字节全部被设置为0xfd(填充符)。
(4)c运行库增加的函数:控制如何截断字符串
这类函数具有两个版本,对应ansi和unicode。
HRESULT StringCchCat( LPTSTR pszDest,size_t cchDest,LPCTSTR pszSrc); HRESULT StringCchCatEx( LPTSTR pszDest,size_t cchDest, LPCTSTR pszSrc,LPTSTR *ppszDestEnd,size_t *pcchRemaining,DWORD dwFlags); HRESULT StringCchCopy( LPTSTR pszDest,size_t cchDest, LPCTSTR pszSrc); HRESULT StringCchCopyEx(LPTSTR pszDest,size_t cchDest, LPCTSTR pszSrc, LPTSTR *ppszDestEnd,size_t *pcchRemaining,DWORD dwFlags);
可以看出,在所有方法的名称中,都含有一个“Cch”,这表示count of characters,即字符个数。通常使用_countof宏获得。
另外还有一些函数含有“cb”,这表示函数要求用字节数来指定大小。通常使用sizeof()获得。
这些函数返回HRESULT,具体的值
| S_OK | 成功。目标缓冲区中包含源字符串,并以/0终止 |
| STRSAFE_E_INVALID_PARAMETER | 失败。将NULL传给了一个参数 |
| STRSAFE_E_INSUFFICIENT_BUFFER | 失败。指定的目标缓冲区太小,无法容纳整个源字符串 |
不同于安全字符串处理函数,这类函数运行时,当缓冲区太小,则会执行截断。
(5)windows字符串处理函数
在shlwapi.h定义了大量好用的字符串函数,可以用来对操作系统有关的数值进行格式化操作。
例如,比较两个字符串是否相等:对于这样的需求可以使用CompareString(Ex)或者CompareStringOrdinal。
CompareString(Ex)一般用于向用户显示的字符串。
CompareStringOrdinal一般用于比较程序内部的字符串,如路径名,注册表项值等。
CompareString(Ex)的处理速度相对于CompareStringOrdinal较慢。
这两个函数的返回0,则表示调用失败;
返回1(CSTR_LESS_THAN)表明string1小于string2;
返回2(CSTR_GREATER_THAN)表明string1大于string2.
(6)推荐的字符处理方式
1、使用通用数据类型和宏,如TCHAR和_T
2、将字符串想象成字符的数组,而非char或字节的数组。
3、与字符串有关的计算需修改。尤其要搞清楚很多的函数要求传递的是字符数还是字节数,如是前者,则用_countof()获取;如是后者,则用(字符数*sizeof(字符类型))获取。
4、避免使用printf系列函数转换ansi和unicode。正确的做法是使用MultiByteToWideChar或WideCharToMultiByte。
5、始终使用安全的字符串处理函数,_s或stringcch,如要控制截断,则使用后者。
6、如果一个缓冲区处理函数的参数中不包括目标缓冲区的长度,那么避免使用。
7、比较字符串时,使用CompareStringOrdina和CompareString(Ex)。前者速度快,适合处理程序内部的字符串;后者用于处理UI的字符串,因为它是以区域设置来适当排序,速度较慢。
转自http://blog.csdn.net/shentao17792/article/details/5314312
Windows 编 程中的字符串的更多相关文章
- 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)
说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...
- ASP.NET 在 Windows Azure 环境中使用基于 SQLServer 的 Session
Session 嘛,占一点儿服务器资源,但是总归比 ViewState 和 Cookie 安全点儿,所以还是要用的. Windows Azure 环境中的 Web 服务器经由负载均衡调度,根本无法保证 ...
- 在 case 语句中使用字符串-转
http://www.cnblogs.com/del/archive/2008/07/08/1237856.html 非常遗憾 Delphi 的 case 语句不支持字符串, 但我觉得这也可能是基于效 ...
- VS 中關於附加到進程中調試 的問題。
在使用Vs 2012 時,項目發佈到Local IIS 中,如果在調試某個頁面中時,都要F5--> Login --> Debug 很繁瑣,下列有一種較快捷的方式,能夠更快的調試代碼. 1 ...
- Windows 商店应用中使用 SharePoint REST API
前面一篇我们介绍了 Office 365 REST API 的官方工具的使用,本篇我们来看一下 SharePoint REST API 本身的描述.结构和使用方法,以及一些使用经验. 首先来看看Sha ...
- Python中的字符串与字符编码
本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常谈的话题,同行们都写过很多这方面的文章. ...
- (译)利用ASP.NET加密和解密Web.config中连接字符串
介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Server, A ...
- PHP中去除字符串中的换行的方法
在PHP中,有时候我们需要对字符串的换行进行过滤,比如天涯PHP博客中文章页面的description信息,我是直接截取的文章内容,并过滤掉html符号,最终还要过滤掉其中的换行.下面整理一下常见的去 ...
- 利用ASP.NET加密和解密Web.config中连接字符串
摘自:博客园 介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Se ...
随机推荐
- jackson反序列化时忽略不需要的字段
有时候,如果数据库表中增加一个字段,但返回的JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段没有在实体类中找到.解决办法很简单,在声明Obje ...
- Linux的段错误调试方法
linux段错误的调试方法 相关博文: http://blog.csdn.net/htianlong/article/details/7439030 http://www.cnblogs.com/pa ...
- iOS- 微信支付 (服务器调起支付 )以及回调不成功的原因 不看后悔
写的不错,给留个言哈... 一. 支付准备工作 1. 微信相关准备工作 (1) 向微信官方开通支付功能. 这个不是前端的工作. (2) 导入官方下载的微信支付SDK包. 我用的是微信开放平台下载的SD ...
- 基于Solr实现HBase的二级索引
文章来源:http://www.open-open.com/lib/view/open1421501717312.html 实现目的: 由于hbase基于行健有序存储,在查询时使用行健十分高效,然后想 ...
- iOS实现书架布局样式【一些电子书的首页】
本文实现了类似电子书首页,用来展示图书或小说的布局页面,书架列表[iPhone6模拟器],屏幕尺寸还没进行适配,只是做个简单的demo[纯代码实现方式] 实现采用的是UICollectionView和 ...
- struts2基础——请求与响应、获取web资源
一.请求与响应 Action1.含义:(1) struts.xml 中的 action 元素,也指 from 表单的 action 属性,总之代表一个 struts2 请求.(2) 用于处理 Stru ...
- Linux各版本的本地root密码破解方法
(一)RedHat/CentOS/Fedora 系统密码破解 1.在grub选项菜单按E进入编辑模式 2.编辑kernel 那行最后加上S (或者Single) 3.按B,启动到single-user ...
- 扩展KMP --- HDU 3613 Best Reward
Best Reward Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...
- C#使用 UdpClient 类进行简单通信的例子
UdpClient 类提供了一些简单的方法,用于在阻止同步模式下发送和接收无连接 UDP 数据报. 因为 UDP 是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接.但您可以选择使用下面两 ...
- c# 正则表达式 匹配中括号&颜色过滤
现在需要匹配 [color=#000000],以"[color"开头,以"[/color]"结束,中间字符数量不限制,最后返回所有匹配的下标. 代码如下: // ...