//宽字节定义:
typedef unsigned short wchar_t
//字符串连接
char *strcat(char *,const char *);
wchar_t *wcscat(wchar_t *,const wchar_t *);
//比较
char *strcmp(const char *,const char *);
wchar_t *wcscmp(const wchar_t *,const wchar_t *);
//有两个专业级的比较函数,测试只能在vista及以上版本的windows系统上才可使用,如下:
TCHAR strW1[MAX_PATH],strW2[MAX_PATH];
ZeroMemory(strW1,sizeof(strW1));
ZeroMemory(strW2,sizeof(strW2));
LCID lcid = GetThreadLocale();
StringCchCopy(strW1,_countof(strW1),_T("hello"));
StringCchCopy(strW2,_countof(strW2),_T("Hello"));
int ret = CompareString(lcid,0,strW1,_countof(strW1),strW2,_countof(strW2));
if (CSTR_EQUAL == ret)
{
AfxMessageBox(_T("strW1 = strW2"));
}else if (CSTR_LESS_THAN == ret)
{
AfxMessageBox(_T("strW1 < strW2"));
}else if (CSTR_GREATER_THAN == ret)
{
AfxMessageBox(_T("strW1 > strW2"));
}
ret = CompareStringOrdinal(strW1,_countof(strW1),strW2,_countof(strW2),TRUE/*忽略大小写*/);
if (CSTR_EQUAL == ret)
{
AfxMessageBox(_T("strW1 = strW2"));
}else if (CSTR_LESS_THAN == ret)
{
AfxMessageBox(_T("strW1 < strW2"));
}else if (CSTR_GREATER_THAN == ret)
{
AfxMessageBox(_T("strW1 > strW2"));
}
注:lstrcmp/lstrcmpi 是通过调用int CompareString();实现的,与C运行期函数时不一样的。
int CompareString( LCID Locale,//当前线程的地方ID,使用GetThreadLocal()获取
DWORD dwCmpFlags,//flag
LPCTSTR lpString1,//str1
int cchCount1, //若为-1,则该函数将认为lpString1是以0结尾,并计算该字符串的长度
LPCTSTR lpString2,//str2
int cchCount2
);
//数字转为KB或者byte的格式化的函数
DWORD dwInValue = 102400001;
TCHAR strW[MAX_PATH];
ZeroMemory(strW,sizeof(strW));
StrFormatKBSize(dwInValue,strW,_countof(strW));
AfxMessageBox(strW);
ZeroMemory(strW,sizeof(strW));
StrFormatByteSize(dwInValue,strW,_countof(strW));
AfxMessageBox(strW);
//取长度
size_t strlen(const char *);
size_t wcslen(const wchar_t *);
//大小写转换
CharLower();
CharUpper();
//判断字符串
IsCharAlpha(TCHAR ch);//大小写字母,返回TRUE
IsCharAlphaNumberic(TCHAR ch);//大小写字符或者数字,返回TRUE
IsCharLower(TCHAR ch);//小写字母返回TRUE
IsCharUpper(TCHAR ch);//大写字母返回TRUE
//sprintf扩充(UNICODE与ANSI转换不推荐使用)
char strA[100];
TCHAR strW[100];
sprintf(szA,"%s","ANSI str"); //ANSI
sprintf(szA,"%S",L"UNOCIDE str"); // UNICODE to ANSI
swprintf(szW,L"%s",L"UNICODE str"); //UNICODE
swprintf(szW,L"%S","ANSI str");// ANSI to UNICODE
//判断文件是否为UNICODE编码
IsUnicodeText();
//ANSI与UNICODE之间的互转(UNICODE与ANSI转换推荐使用)
WideCharToMultiByte(); //UNICODE to ANSI
MultiByteToWideChar(); //ANSI to UNICODE
//兼容性
#ifdef UNICODE
typedef wchar_t TCHAR
#else
typedef chat TCHAR
#endif
//以下函数为宏,在UNICODE和ANSI下是通用的//(a)第一组函数。此组函数宏时定义在WinBase.h文件内,是windows自己定义的函数
//WinBase.h文件内一段code
WINBASEAPI
int
WINAPI
lstrcmpA(
__in LPCSTR lpString1,
__in LPCSTR lpString2
);
WINBASEAPI
int
WINAPI
lstrcmpW(
__in LPCWSTR lpString1,
__in LPCWSTR lpString2
);
#ifdef UNICODE
#define lstrcmp lstrcmpW
#else
#define lstrcmp lstrcmpA
#endif // !UNICODE
WINBASEAPI
int
WINAPI
lstrcmpiA(
__in LPCSTR lpString1,
__in LPCSTR lpString2
);
WINBASEAPI
int
WINAPI
lstrcmpiW(
__in LPCWSTR lpString1,
__in LPCWSTR lpString2
);
#ifdef UNICODE
#define lstrcmpi lstrcmpiW
#else
#define lstrcmpi lstrcmpiA
#endif // !UNICODE
WINBASEAPI
__out
LPSTR
WINAPI
lstrcpynA(
__out_ecount(iMaxLength) LPSTR lpString1,
__in LPCSTR lpString2,
__in int iMaxLength
);
WINBASEAPI
__out
LPWSTR
WINAPI
lstrcpynW(
__out_ecount(iMaxLength) LPWSTR lpString1,
__in LPCWSTR lpString2,
__in int iMaxLength
);
#ifdef UNICODE
#define lstrcpyn lstrcpynW
#else
#define lstrcpyn lstrcpynA
#endif // !UNICODE
#if defined(DEPRECATE_SUPPORTED)
#pragma warning(push)
#pragma warning(disable:4995)
#endif
WINBASEAPI
__out
LPSTR
WINAPI
lstrcpyA(
__out LPSTR lpString1,
__in LPCSTR lpString2
);
WINBASEAPI
__out
LPWSTR
WINAPI
lstrcpyW(
__out LPWSTR lpString1,
__in LPCWSTR lpString2
);
#ifdef UNICODE
#define lstrcpy lstrcpyW
#else
#define lstrcpy lstrcpyA
#endif // !UNICODE
WINBASEAPI
__out
LPSTR
WINAPI
lstrcatA(
__inout LPSTR lpString1,
__in LPCSTR lpString2
);
WINBASEAPI
__out
LPWSTR
WINAPI
lstrcatW(
__inout LPWSTR lpString1,
__in LPCWSTR lpString2
);
#ifdef UNICODE
#define lstrcat lstrcatW
#else
#define lstrcat lstrcatA
#endif // !UNICODE
#if defined(DEPRECATE_SUPPORTED)
#pragma warning(pop)
#endif
WINBASEAPI
int
WINAPI
lstrlenA(
__in LPCSTR lpString
);
WINBASEAPI
int
WINAPI
lstrlenW(
__in LPCWSTR lpString
);
#ifdef UNICODE
#define lstrlen lstrlenW
#else
#define lstrlen lstrlenA
#endif // !UNICODE
//(b)第二组函数。此组函数定义在tchar.h文件内,应该是c++的库文件
#ifdef _UNICODE //tchar.h文件内一段定义code
#define _tcscat wcscat
#define _tcscat_s wcscat_s
#define _tcschr wcschr
#define _tcscpy wcscpy
#define _tcscpy_s wcscpy_s
#define _tcscspn wcscspn
#define _tcslen wcslen
#define _tcsnlen wcsnlen
#define _tcsncat wcsncat
#define _tcsncat_s wcsncat_s
#define _tcsncat_l _wcsncat_l
#define _tcsncat_s_l _wcsncat_s_l
#define _tcsncpy wcsncpy
#define _tcsncpy_s wcsncpy_s
#define _tcsncpy_l _wcsncpy_l
#define _tcsncpy_s_l _wcsncpy_s_l
#els
#define _tcscat strcat
#define _tcscat_s strcat_s
#define _tcscpy strcpy
#define _tcscpy_s strcpy_s
#define _tcsdup _strdup
#define _tcslen strlen
#define _tcsnlen strnlen
#define _tcsxfrm strxfrm
#define _tcsxfrm_l _strxfrm_l
#define _tcserror strerror
#define _tcserror_s strerror_s
#define __tcserror _strerror
#define __tcserror_s _strerror_s
#endif
//注:区别说明:
//When your project settings are MBCS(多字节字符集), tcslen and lstrlen are same. You
//should not use lstrlen on a UNICODE string. _tcslen will work on a
//UNICODE string as well as MBCS.
//If you dont know what MBCS/UNICODE are, use _tcslen
//在windows核心编程书上说lstr系列的函数是kernel32的函数,反正应用开发就是使用_tcslen()比较好(个人认为)
//_tcscpy_s之类的安全性问题
//做安全性检查:指针不为NULL,整数在有效范围内,枚举值是否有效,缓冲区是否足够容纳结果数据
//除了_s之类的安全函数之外,还有一个strsafe.h文件定义的一系列安全函数,这是C运行库的函数,如下:(一段实例code)
#ifdef UNICODE
#define StringCchCopy StringCchCopyW
#else
#define StringCchCopy StringCchCopyA
#endif // !UNICODE
STRSAFEAPI
StringCchCopyA(
__out_ecount(cchDest) STRSAFE_LPSTR pszDest,
__in size_t cchDest,
__in STRSAFE_LPCSTR pszSrc)
{
HRESULT hr;
hr = StringValidateDestA(pszDest, cchDest, NULL, STRSAFE_MAX_CCH);
if (SUCCEEDED(hr))
{
hr = StringCopyWorkerA(pszDest,
cchDest,
NULL,
pszSrc,
STRSAFE_MAX_LENGTH);
}
return hr;
}
STRSAFEAPI
StringCchCopyW(
__out_ecount(cchDest) STRSAFE_LPWSTR pszDest,
__in size_t cchDest,
__in STRSAFE_LPCWSTR pszSrc)
{
HRESULT hr;
hr = StringValidateDestW(pszDest, cchDest, NULL, STRSAFE_MAX_CCH);
if (SUCCEEDED(hr))
{
hr = StringCopyWorkerW(pszDest,
cchDest,
NULL,
pszSrc,
STRSAFE_MAX_LENGTH);
}
return hr;
}
#endif // !STRSAFE_NO_CCH_FUNCTIONS
#ifndef STRSAFE_NO_CB_FUNCTIONS
#ifdef UNICODE
#define StringCbCopy StringCbCopyW
#else
#define StringCbCopy StringCbCopyA
#endif // !UNICODE
STRSAFEAPI
StringCbCopyA(
__out_bcount(cbDest) STRSAFE_LPSTR pszDest,
__in size_t cbDest,
__in STRSAFE_LPCSTR pszSrc)
{
HRESULT hr;
size_t cchDest = cbDest / sizeof(char);
hr = StringValidateDestA(pszDest, cchDest, NULL, STRSAFE_MAX_CCH);
if (SUCCEEDED(hr))
{
hr = StringCopyWorkerA(pszDest,
cchDest,
NULL,
pszSrc,
STRSAFE_MAX_LENGTH);
}
return hr;
}
STRSAFEAPI
StringCbCopyW(
__out_bcount(cbDest) STRSAFE_LPWSTR pszDest,
__in size_t cbDest,
__in STRSAFE_LPCWSTR pszSrc)
{
HRESULT hr;
size_t cchDest = cbDest / sizeof(wchar_t);
hr = StringValidateDestW(pszDest, cchDest, NULL, STRSAFE_MAX_CCH);
if (SUCCEEDED(hr))
{
hr = StringCopyWorkerW(pszDest,
cchDest,
NULL,
pszSrc,
STRSAFE_MAX_LENGTH);
}
return hr;
}
#endif // !STRSAFE_NO_CB_FUNCTIONS
//(4)分配内存给UNICODE
malloc(sizeof(TCHAR) * nLen);//TRUE
malloc(nLen);//false
(5)StringCchPrintf是替代sprintf。
它接受一个格式字符串和参数列表和返回一个格式化字符串。
大小,在字符,目的地缓冲区提供函数来确保StringCchPrintf不写这个缓冲区的末尾的。
HRESULT StringCchPrintf( LPTSTR pszDest,
size_t cchDest,
LPCTSTR pszFormat,
...
);
如下:
StringCchPrintf(szInfo,_countof(szInfo),_T("KernelTime=%u | UserTime = %u"),KernelTime.dwLowDateTime/10000,
UserTime.dwLowDateTime/10000);