QQ登录

只需一步,快速开始

搜索
【活动】边做笔记边学习,还能赢取奖学金!
查看: 114|回复: 1

[学习笔记] 《Windows SDK》009 安全的使用字符串

[复制链接]
累计签到:49 天
连续签到:25 天
最佳答案
3 
发表于 2017-7-10 14:17:48 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 BngThea 于 2017-7-15 09:53 编辑

一 核心知识点
* 字符串处理
1 可以使用旧的字符串处理函数lstrlen, wprintf, lstrcat, lstrcpy
2 在Windows编程中推荐使用更安全的函数,这些函数都被包含在strsafe.h中
3 上面两者的区别主要在于后者加强了对字符串长度的限定,从而有效的防止溢出漏洞的产生


二 新API函数
* StringCchLength(szBuffer, 128, &iTarget)
该函数获得字符串的长度,不含结尾的'\0'

1  该函数从最大128个字符空间中扫描szBuffer字符串的长度,并将结果赋值给iTarget,其中128可以设置为任意无符号整型

2  该函数返回一个HRESULT,可以通过SUCCEEDED于判定是否成功

* StringCchPrintf(szBuffer, 128, TEXT("%3d: %s"), i + 1, TEXT("I love FishC.com!"));
该函数将字符串的内容放到缓存中

1 各参数含义:
第一个参数:缓存,用来存放字符串的对象
第二个参数:限定的字符个数,可以为任意无符号整型,但要保证够用
第三个参数:字符串格式
随后的参数:字符串内容

2 上述语句结果:  将行号 + I love FishC.com! 存放到szBuffer中

3 该函数可以响应浮点数类型数据(wsprintf不能)

4 该函数返回一个HRESULT,可以通过SUCCEEDED于判定是否成功

* StringCchCat(szTargetBuffer, 256, szSequentBuffer)
该函数将两个字符串拼接起来

1 各参数含义:
第一个参数:目标缓存,将存放拼接后的字符串
第二个参数:限定的字符个数,可以为任意无符号整型,但要保证够用
第三个参数:被拼接到后面的字符串

2 上述语句结果:  将第一个参数和第三个参数的内容拼接起来,并存放到第一个参数中

3 该函数应保证第二个参数足以放下两个字符串的长度+1(结尾'\0')

4 该函数返回一个HRESULT,可以通过SUCCEEDED于判定是否成功

* StringCchCopy(szTargetBuffer, 256, szBuffer)
该函数使用基本同StringCchCat,只是功能改为将第三个参数中的字符串拷贝到第一个参数中


三 示例
    比较常用的用于判定字符串操作的代码如下
  1. if (SUCCEEDED(StringCchCat(szTargetBuffer, 256, szSequentBuffer)))
  2.         //do something
  3. else
  4.         //do other thing
复制代码


评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
小甲鱼 + 3 + 3 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
累计签到:2131 天
连续签到:9 天
最佳答案
124 
发表于 2017-7-10 18:12:25 | 显示全部楼层
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋手机版Archiver( 粤公网安备 44051102000370号 | 粤ICP备11014136号

© 2010-2017 FishC.com GMT+8, 2017-7-28 12:31 Powered by Discuz! X2.5 Theme by dreambred

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