从0开始学习《Windows程序设计》:安全的使用字符串!

一、WINDOWS演习C语言的字符串处理函数

wsprintf
lstrlen
lstrcpy
lstrcat

需求:在窗口中打印10行字符串,并打印行号?
wsprintf函数档案:
https://fishc.com.cn/forum.php?mod=viewthread&tid=49691&extra=page%3D1%26filter%3Dtypeid%26typeid%3D420
转自鱼C论坛

lstrlen获取字符串的个数。

for (int i = 0; i < 10; i++)
		{
			wsprintf(szBuffer, TEXT("%3d:%s"), i + 1, TEXT("爱心天使的守护!"));
			TextOut(hdc, 0, i*LINEHEIGHT, szBuffer, lstrlen(szBuffer));
		}

在这里插入图片描述
lstrcpy是拷贝字符串的,lstrcat是拼接字符串的。
这里我们如果把szBuffer的大小改的比输入的字符串小,程序运行的时候救护崩溃!

二、安全的字符串处理

StringCchPrintf
StringCchLength
StringCchCopy
StringCchCat

微软由于过去对缓冲区的保护非常薄弱,常常会发生缓冲区溢出的问题,所以会常遭到黑客的缓冲溢出攻击!

StringCchPrintf
函数功能:

StringCchPrintf 函数用于把数据格式化写入到指定的缓冲区里,该函数要求提供目标缓冲区的大小,确保不会发生越界访问。

微软推荐使用该函数替代以下函数:

sprintf, swprintf, _stprintf
wsprintf
wnsprintf
_snprintf, _snwprintf, _sntprintf


API 函数原型:

HRESULT StringCchPrintf(
  _Out_  LPTSTR pszDest,
  _In_   size_t cchDest,
  _In_   LPCTSTR pszFormat,
  _In_   ...
);
复制代码


参数解析:

参数	含义
pszDest	指定格式化数据将要写入的缓冲区
cchDest	1. 缓冲区大小
2. 应该设置足够大,以容纳字符串和结束标记('\n')
3. 最大允许的字符数是 STRSAFE_MAX_CCH
pszFormat	1. 格式化字符串
2. 与 pirntf 的格式化字符串一致
...	可变参数,参数的个数取决 pszFormat 参数


返回值:

这个函数返回一个 HRESULT,而不是像 sprintf 一样返回存储在其目标缓冲区的字节数。我们强烈建议您使用 SUCCEEDED 和 FAILED 宏来测试这个函数的返回值。

返回值可以是以下任意一个值:

返回代码	描述
S_OK	表示有足够的空间将拷贝到 pszDest,没有发生截断
STRSAFE_E_INVALID_PARAMETER	cchDest 的值为 0 或大于 STRSAFE_MAX_CCH
STRSAFE_E_INSUFFICIENT_BUFFER	1. 由于缓冲区空间不足而导致的复制失败
2. 结果被截断,当仍然包含'\0'结尾
3. 如果截断操作可以被接受,则不一定被看作是失败
HDC hdc;
	PAINTSTRUCT ps;
	TCHAR szBuffer[100] = TEXT("爱心天使的守护") ;
	size_t iTarget;
	switch (message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		for (int i = 0; i < 10; i++)
		{
			StringCchPrintf(szBuffer, 128, TEXT("%d: %s"), i + 1, TEXT("爱心天使的守护!"));
			StringCchLength(szBuffer, 128, &iTarget);
			TextOut(hdc, 0, i*LINEHEIGHT, szBuffer, lstrlen(szBuffer));
		}
		EndPaint(hwnd, &ps);
		return 0;

在这里插入图片描述
在次测试,就不会发生上面的问题了!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值