頭文件
Strsafe
StringCchCopy(代替strcpy,wcscpy,_tcscpy,lstrcpy,StrCpy)
功能
- 復(fù)制一個(gè)字符串到緩沖區(qū)
- 下面是StrSafe.h中對(duì)這個(gè)函數(shù)的定義缨叫,可以看出來排吴,這個(gè)函數(shù)要先檢測(cè)字符串長(zhǎng)度的有效性频蛔,然后才是根據(jù)參數(shù)進(jìn)行字符串的復(fù)制操作。(這個(gè)函數(shù)分為A版本和W版本,下面是A版本的代碼,W版本和這個(gè)類似)
參數(shù)分析
- 第一個(gè)參數(shù)是目標(biāo)緩沖區(qū),用于接收拷貝過來的字符串
- 第二個(gè)參數(shù)是目標(biāo)緩沖區(qū)的大小: 這個(gè)值必須大于或等于pszSrc的長(zhǎng)度+1猾骡,并且不應(yīng)該超過STRSAFE_MAX_CCH
- 第三個(gè)參數(shù)是待拷貝的字符串
返回值
返回一個(gè)HRESULT,而不是指向緩沖區(qū)的指針敷搪。
- S_OK,字符串正炒鄙冢拷貝
- STRSAFE_E_INVALID_PARAMETER
- cchDest 參數(shù)的值為 0
- cchDest 參數(shù)的值大于 STRSAFE_MAX_CCH
- STRSAFE_E_INSUFFICIENT_BUFFER
- 因緩沖區(qū)空間不足導(dǎo)致失敗
- 結(jié)果被截?cái)嗌目保?dāng)仍然包含'\0'結(jié)尾
- 如果截?cái)嗖僮骺梢员唤邮埽瑒t不一定被看作是失敗
StringCchCopyA(
_Out_writes_(cchDest) _Always_(_Post_z_) STRSAFE_LPSTR pszDest,
_In_ size_t cchDest,
_In_ STRSAFE_LPCSTR pszSrc)
{
HRESULT hr;
hr = StringValidateDestA(pszDest, cchDest, STRSAFE_MAX_CCH);
if (SUCCEEDED(hr))
{
hr = StringCopyWorkerA(pszDest,
cchDest,
NULL,
pszSrc,
STRSAFE_MAX_LENGTH);
}
else if (cchDest > 0)
{
*pszDest = '\0';
}
return hr;
}
StringCchCopyEx
- Ex一般是不帶Ex的函數(shù)的擴(kuò)展捞镰。在這里闸与,后三個(gè)參數(shù)通常對(duì)進(jìn)行完基本的字符串的操作之后毙替,對(duì)于截?cái)嘁约熬彌_區(qū)的 處理。
- 使用Ex版本的函數(shù)践樱,可以決定是否執(zhí)行開銷大的填充操作(尤其是在目標(biāo)緩沖區(qū)很大的時(shí)候)厂画,以及用什么字符來進(jìn)行填充。
參數(shù)說明
- 前三個(gè)參數(shù)參照第一個(gè)的說明
- 第四個(gè)參數(shù)表示pszDest結(jié)尾處的指針
- 第五個(gè)參數(shù)表示目標(biāo)緩沖區(qū)的剩余空間長(zhǎng)度拷邢。(包括結(jié)束符)
- 第六個(gè)參數(shù)可以使用:
- STRSAFE_FILL_BEHIND_NULL袱院,剩余字符串被設(shè)為\0
- STRSAFE_IGNORE_NULLS
- STRSAFE_FILL_ON_FAILURE
- STRSAFE_NULL_ON_FAILURE
- STRSAFE_NO_TRUNCATION
-
如果使用STRSAFE_FILE_BYTE來代替STRSAFE_FILL_BEHIND_NULL,那么函數(shù)會(huì)用指定的字節(jié)來填充目標(biāo)緩沖區(qū)中剩余的部分瞭稼。
具體使用可以查看:
https://msdn.microsoft.com/zh-cn/library/ms647529.aspx
StringCchCopyExA(
_Out_writes_(cchDest) _Always_(_Post_z_) STRSAFE_LPSTR pszDest,
_In_ size_t cchDest,
_In_ STRSAFE_LPCSTR pszSrc,
_Outptr_opt_result_buffer_(*pcchRemaining) STRSAFE_LPSTR* ppszDestEnd,
_Out_opt_ size_t* pcchRemaining,
_In_ DWORD dwFlags)
StringCchCat
功能
- 字符串的連接
- 參數(shù)類似第一個(gè)函數(shù)忽洛,但是這個(gè)函數(shù)里的pszDest可以用作輸入輸出
StringCchCatA(
_Inout_updates_(cchDest) _Always_(_Post_z_) STRSAFE_LPSTR pszDest,
_In_ size_t cchDest,
_In_ STRSAFE_LPCSTR pszSrc)
{
HRESULT hr;
size_t cchDestLength;
hr = StringValidateDestAndLengthA(pszDest,
cchDest,
&cchDestLength,
STRSAFE_MAX_CCH);
if (SUCCEEDED(hr))
{
hr = StringCopyWorkerA(pszDest + cchDestLength,
cchDest - cchDestLength,
NULL,
pszSrc,
STRSAFE_MAX_LENGTH);
}
return hr;
}
StringCchCatEx
- 參數(shù)和第二個(gè)函數(shù)類似
StringCchCatEx(
_Inout_updates_(cchDest) _Always_(_Post_z_) LPTSTR pszDest OPTIONAL,
_In_ size_t cchDest,
_In_ LPCTSTR pszSrc OPTIONAL,
_Outptr_opt_result_buffer_(*pcchRemaining) LPTSTR* ppszDestEnd OPTIONAL,
_Out_opt_ size_t* pcchRemaining OPTIONAL,
_In_ DWORD dwFlags
);
StringCchPrintf
StringCchPrintfA(
_Out_writes_(cchDest) _Always_(_Post_z_) STRSAFE_LPSTR pszDest,
_In_ size_t cchDest,
_In_ _Printf_format_string_ STRSAFE_LPCSTR pszFormat,
...)
{
HRESULT hr;
hr = StringValidateDestA(pszDest, cchDest, STRSAFE_MAX_CCH);
if (SUCCEEDED(hr))
{
va_list argList;
va_start(argList, pszFormat);
hr = StringVPrintfWorkerA(pszDest,
cchDest,
NULL,
pszFormat,
argList);
va_end(argList);
}
else if (cchDest > 0)
{
*pszDest = '\0';
}
return hr;
}