CString 型转化成 int 型 把 CString 类型的数据转化成整数类型最简单的方法就是使用标准的字符串到整数转换例程。
虽然通常你怀疑使用_atoi()函数是一个好的选择,它也很少会是一个正确的选择。如果你准备使用 Unicode 字符,你应该用_ttoi(),它在 ANSI 编码系统中被编译成_atoi(),而在 Unicode 编码系统中编译成_wtoi()。你也可以考虑使用_tcstoul()或者_tcstol(),它们都能把字符串转化成任意进制的长整数(如二进制、八进制、十进制或十六进制),不同点在于前者转化后的数据是无符号的(unsigned),而后者相反。看下面的例子:
CString hex = _T("FAB");
CString decimal = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal));
在做DWORD与 CString 比较的时候 ,需要将CString 转换成 DWORD,有几种转换方法,但是明明转换结果是一样的,可就是提示不相等,后来 _tcstoul()转换后才相等 ,记录下
CString str = lp->GetSubItem(nCol);
// MessageBox(str,m_strItem,MB_OK);
DWORD dwData = _tcstoul( str, NULL, 10 ); // 10进制
if (dwItem ==dwData)
{
//AfxMessageBox("找到找到找到找到找到找到找到找到找到找到找到找到找到");
return pCur;
}
使用_tcstoul()或者_tcstol(),它们都能把字符串转化成任意进制的长整数(如二进制、八进制、十进制或十六进制),不同点在于前者转化后的数据是无符号的(unsigned),而后者相反。看下面的例子:
CString hex = _T("FAB");
CString decimal = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ANSI UNICODE 通用
(char.h) (wchar.h) (tchar.h)
char wchar_t TCHAR
char * wchar_t * PTCHAR (PTSTR,LPWSTR,PWSTR,WCHAR)
printf wprintf _tprintf
scanf wscanf _tscanf
atoi _wtoi _ttoi
atol _wtol _ttol
itoa _itow _itot
ltoa _ltow _ltot
atof _wtof _tstof
strlen wcslen _tcslen
strcat wcscat _tcscat
strcpy wcscpy _tcscpy
strcmp wcscmp _tcscmp
|
ASCII |
UNICODE |
TCHAR |
VS2005 |
int |
atoi |
_wtoi |
_tstoi _ttoi |
_atoi_l _wtoi_l |
long |
atol |
_wtol |
_tstoi _ttoi |
_atoi_l _wtoi_l |
__int64 |
_atoi64 |
_wtoi64 |
_tstoi64 _ttoi64 |
_atoi64_l _wtoi64_l |
float |
|
|
|
_atoflt _atoflt_l |
double |
atof |
_wtof |
_tstof _ttof |
_atof_l _wtof_l _atodbl _atodbl_l |
long double |
|
|
|
_atoldbl _atoldbl_l |
atof, _atof_l, _wtof, _wtof_l |
Convert string to float |
atoi, _atoi_l, _wtoi, _wtoi_l |
Convert string to int |
_atoi64, _atoi64_l, _wtoi64, _wtoi64_l |
Convert string to __int64 |
atol, _atol_l, _wtol, _wtol_l |
Convert string to long |
_ecvt, _ecvt_s |
Convert double to string of specified length |
_fcvt, _fcvt_s |
Convert double to string with specified number of digits following decimal point |
_gcvt, _gcvt_s |
Convert double number to string; store string in buffer |
_itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow, _itoa_s, _i64toa_s, _ui64toa_s, _itow_s, _i64tow_s, _ui64tow_s |
Convert int or __int64 to string |
_ltoa, _ltow, _ltoa_s, _ltow_s |
Convert long to string |
strtod, _strtod_l, wcstod, _wcstod_l |
Convert string to double |
strtol, wcstol, _strtol_l, _wcstol_l |
Convert string to long integer |
strtoul, _strtoul_l, wcstoul, _wcstoul_l |
Convert string to unsigned long integer |
_ultoa, _ultow, _ultoa_s, _ultow_s |
Convert unsigned long to string |
atof, _atof_l, _wtof, _wtof_l |
Convert wide-character string to a double |
atoi, _atoi_l, _wtoi, _wtoi_l |
Convert wide-character string to int |
_atoi64, _atoi64_l, _wtoi64, _wtoi64_l |
Convert wide-character string to __int64 |
atol, _atol_l, _wtol, _wtol_l |
Convert wide-character string to long |
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。
---------------------------------------------------------------
ASSERT宏定义如下
#define ASSERT(f) \
do \
{ \
if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \
AfxDebugBreak(); \
} while (0) \
ASSERT(逻辑表达式)
如果括号中的逻辑表达式值为假的话,会弹出调试命令窗口,提示具体在哪个文件的哪一行发生了断言错误!
---------------------------------------------------------------
ASSERT
Evaluates an expression, and displays a diagnostic message if the expression is FALSE. Ignored in retail builds.
Syntax
ASSERT(
cond
);
Parameters
cond
Expression to evaluate.
Remarks
In debug builds, if the expression is FALSE, this macro displays a message box with the text of the expression, the name of the source file, and the line number. The user can ignore the assertion, enter the debugger, or quit the application.
Example
ASSERT(rtStartTime <= rtEndTime);
---------------------------------------------------------------
断言(ASSERT)的使用,方法很简单。为什么要用,初学者可能比较迷惑。
契约式编程讲的比较清楚,建议可以先看看这类书。
一个函数由前置条件、后置条件和不变式组成。在VC中,我们可以通过断言来保证这三个条件。可以大大提高了软件的质量。
---------------------------------------------------------------
如果ASSERT()中的条件不成立(比如 ASSERT(0) ; ),会弹出一个比较吓人的对话框。
点击重试,可以到达 ASSERT 断言不成立的那一行,
此时可以在watch窗口查看变量值,找出出错的原因。
如果程序能够继续运行,可以按F5继续调试。