字符和字符串处理

安全字符串函数

不安全的字符串函数

Strsafe函数

Safe CRT函数

(C运行库)

strcpy, wcscpy, _tcscpy, _mbscpy, strcpy , lstrcpy, _tccpy, _mbccpy

StringCchCopy  StringCbCopy

StringCchCopyEx  StringCbCopyEx

strcpy_s

strcat, wcscat , _mbscat, strcat, lstrcat, , strcatbuff, strcatchain, _tccat, _mbccat

StringCchCat  StringCbCat

StringCchCatEx  StringCbCatEx

strcat_s

wnsprintf, wsprintf, sprintf, swprintf, _stprintf

StringCchPrintf  StringCbPrintf

StringCchPrintfEx StringCbPrintfEx

_snprintf_s

_snwprintf_s

目标缓冲区太小时,不发生截断

目标缓冲区太小时,会发生截断

不发生截断

★String Safe函数:微软提供的内联形式函数,可以当做API

(在strsafe.h文件中,注意要在包含其他文件之后,才包含该文件!

★Safe CRT函数:C运行库


Str Safe函数的介绍(须含包strsafe.h文件)——目标缓冲区太小时,会发生截断

(1)StringCchXXXX函数——其中的Cch表示字符的个数,可用_countof(pszDest)计算

StringCchCopy——复制一个字符串到缓冲区,但要求提供目标缓冲区的长度,以确保写入数据不会超出缓冲区的末尾使用该函数替代以下函数:strcpy、wcscpy、_tcscpy、lstrcpy、StrCpy等函数。

参数

描述

LPTSTR pszDest

缓冲区,用于接收拷贝过来的字符串

size_t cchDest

①目标缓冲区的大小(字符个数)——_countof(pszDest)

②该值必须大于或等于 lstrlen(pszSrc) + 1(待拷贝字符串的字符+'\0')

③这个数不能超过 STRSAFE_MAX_CCH。

LPCTSTR pszSrc

待拷贝的字符串

返回值

①S_OK:字符串正常拷贝

②STRSAFE_E_INVALID_PARAMETER:cchDest 参数的值为 0或cchDest 参数的值大于 STRSAFE_MAX_CCH。

③STRSAFE_E_INSUFFICIENT_BUFFER:因缓冲区空间不足导致失败;结果被截断,但仍然包含'\0'结尾;如果截断操作可以被接受,则不一定被看作是失败,即这时的返回值也可认为是可接受的。

StringCchCat——将一个字符串拼接到另一个字符,使用该函数替代以下函数:strcat、 wcscat、_tcsat、lstrcat、StrCat和StrCatBuff等函数。

参数

描述

LPTSTR pszDest

①目标缓冲区,同时包含第一个字符串

②该缓冲区应该大于或等于(lstrlen(pszDest) +lstrlen(pszSrc) + 1)*sizeof(TCHAR)

size_t cchDest

①目标缓冲区的大小(字符个数)——_countof(pszDest)

②该缓冲区必须大于或等于lstrlen(pszDest) +lstrlen(pszSrc) + 1(两个字符串的字符总和+'\0')

③这个数不能超过 STRSAFE_MAX_CCH。

LPCTSTR pszSrc

第2个字符串

返回值

①S_OK:字符串正常拼接

②STRSAFE_E_INVALID_PARAMETER:cchDest 参数的值为 0或cchDest 参数的值大于 STRSAFE_MAX_CCH;目标缓冲区空间已满。

③STRSAFE_E_INSUFFICIENT_BUFFER:因缓冲区空间不足导致失败;结果被截断,但仍然包含'\0'结尾;如果截断操作可以被接受,则不一定被看作是失败。

StringCchLength——用于确定字符串是否超过了规定的长度,以字符为计算单位(不含\0),用来替换strlen、wcslen和_tcslen函数。

参数

描述

LPCTSTR psz

指向待检查的字符串

size_t cchMax

①psz 参数里最大允许的字符数量,包括'\0'

②这个数不能超过 STRSAFE_MAX_CCH。

size_t *pcch

①psz 参数指向字符串的字符个数,不包括'\0',字符串长度返回这参数中。

②这个值只有在 psz 指针不为 NULL,且函数成功时有效

返回值

①S_OK:psz 指向的字符串不为空,且字符串的长度(包括'\0')小于等于 cchMax

②STRSAFE_E_INVALID_PARAMETER:psz 指向空字符串;cchMax 的值大于STRSAFE_MAX_CCH;psz 指向的字符串的字符个数超过 cchMax。

StringCchPrintf——把数据格式化写入到指定的缓冲区里,使用该函数替代以下函数:

Sprintf、swprintf、 _stprintf、wsprintf、wnsprintf、_snprintf、_snwprintf和 _sntprintf等函数

参数

描述

LPTSTR pszDest

指定格式化数据将要写入的缓冲区

size_t cchDest

①缓冲区大小,应该设置足够大,以容纳字符串和结束标记('\n')

②最大允许的字符数是 STRSAFE_MAX_CCH

LPCTSTR pszFormat

①格式化字符串,与 pirntf 的格式化字符串一致

②这个值只有在 psz 指针不为 NULL,且函数成功时有效

...

可变参数,参数的个数取决 pszFormat 参数

返回值

①S_OK:psz 表示有足够的空间将拷贝到 pszDest,没有发生截断

②STRSAFE_E_INVALID_PARAMETER:cchDest 的值为 0 或大于 STRSAFE_MAX_CCH。

③STRSAFE_E_INSUFFICIENT_BUFFER:由于缓冲区空间不足而导致的复制失败;结果被截断,当仍然包含'\0'结尾;如果截断操作可以被接受,则不一定被看作是失败。

(2)StringCcbXXXX函数:其中的Ccb表示目标缓冲区的字节数,可用sizeof(pszDest)

(3)StringCchXXXXEx和StringCcbEx等扩展版本的函数,(见课本P22页)


猜你喜欢

转载自blog.csdn.net/knightonhourse/article/details/80262783