65,189
社区成员




char wchar_t TCHAR
LPSTR LPWSTR LPTSTR
LPCSTR LPCWSTR LPCTSTR
std::string std::wstring CString
/**
* @param [in] _MaxCount 限制取出_Source中字符的个数
* @retval 返回转换的字符的个数,包括对结束符的计算
*/
size_t __cdecl wcstombs(char* _Dest, const wchar_t* _Source, size_t _MaxCount);
wcstombs_s的定义:
/**
* @param [out] _PtNumOfCharConverted 返回转换的字符的个数,包括对结束符的计算
* @param [out] _Dst 转换字符存放的目的地址
* @param [in] _DstSizeInBytes 限制取出_Src中字符的个数,同时也限制为_Dst分配的缓存空间
* @param [in] _Src 要转换的字符
* @param [in] _MaxCountInBytes 限制取出_Src中字符的个数
* @retval 返回错误号,为0则表示转换成功
*/
errno_t __cdecl wcstombs_s(size_t* _PtNumOfCharConverted, char* _Dst, size_t _DstSizeInBytes, const wchar_t* _Src, size_t _MaxCountInBytes);
函数wcstombs_s中参数_DstSizeInBytes起到的作用:对目的地址_Dst分配的缓存空间的限制,若sizeof(_Dst)/sizeof(char) < _DstSizeInBytes,则会提示异常;同时也限制从_Src取出的个数,至于确定取_Src中字符的个数,先是选择_DstSizeInBytes和_MaxCountInBytes中较小的值minNum,然后如果minNum小于wcslen(_Src),则从中取出minNum个字符,再判断_DstSizeInBytes < (minNum + 1),为true则出断言。
所以一般的形式为这样:
wcstombs_s(_PtNumOfCharConverted, _Dst, wcslen(_Src) + 1, _Src, _TRUNCATE);
mbstowcs_s(_PtNumOfCharConverted, _Dst, strlen(_Src) + 1, _Src, _TRUNCATE);
wcstombs_s、wcstombs和mbstowcs_s、mbstowcs都是调用的WideCharToMultiByte和MultiByteToWideChar。这里是否可以看成是对WideCharToMultiByte和MultiByteToWideChar的封装使用?
char _Dest[100];
sprintf_s(_Dest, 100, "%s", "ANSII STR");
其中转换格式必须是小写s;
转换宽字符的用法:
sprintf_s(_Dest, 100, "%S", L"UNICODE STR");
其中转换格式必须是大写S;对比例子:
sprintf_s(_Dest, 100, "%s_%S", "ANSII STR", L"UNICODE STR");
同样,swprintf和swprintf_s的用法:
wchar_t _Dest[100];
swprintf_s(_Dest, 100, L”%s_%S”, L”UNICODE STR”, “ANSII STR”);
/**
* @param [out] _Dest 输出的目的地址
* @param [in] _Format 输出格式
* @param [in] ... 参数列表
* @retval 返回输出字符的个数
*/
int __cdecl sprintf(char* _Dest, const char* _Format, ...);
sprintf_s定义:
/**
* @param [out] _DstBuf 输出的目的地址
* @param [in] _SizeInBytes 限制按照输出格式_Format转换后的字符个数,同时也限制为_DstBuf分配的缓存空间
* @param [in] _Format 输出格式
* @param [in] ... 参数列表
* @retval 返回输出字符的个数
*/
int __cdecl sprintf_s(char* _DstBuf, size_t _SizeInBytes, const char* _Format, ...);
函数sprintf和sprintf_s的区别:sprintf_s函数多了一个对目的地址分配的空间和转换字符的个数的限制。例:
ASSERT((sizeof(tranStr)/sizeof(char)) <= _SizeInBytes);
ASSERT((sizeof(_DstBuf)/sizeof(char)) >= _SizeInBytes);
首先判断的是按照输出格式转换的字符串tranStr的个数是否小于等于SizeInBytes,若否,则弹出断言:Buffer to small。可见,在根据_Format进行字符转换时所分配的临时存储空间是由_SizeInBytes来指定的。然后对输出的目的地址_DstBuf的空间大小进行判断,判断其大小是否大于等于_SizeInButes,若否,则可能会出现误用非法空间的可能。不过sprintf_s都为其做了安全处理。所以总的来说,用sprintf_s比用sprintf更安全。
char c='A';//内存中对应字节41
wchar_t wc=L'啊';//内存中对应字节4A 55
char cs[]="AB啊";//内存中对应字节41 42 B0 A1 00 (GBK编码时)可见窄字符中文字符也是两个字节
wchar_t ws[]=L"AB啊";//内存中对应字节41 00 42 00 4A 55 00 00