工作中遇到的小问题,写成随笔
问题描述:
(1)
//工作站
typedef struct
{
char chWorkstationName[11];//工作站名
char chIP[16];//IP地址
char chAE[16];//AE名
char chUsedPrinter[41];//使用打印机
char chOcrFlag[40];//是否使用Ocr设置 } WORKSTATION_SET;
typedef std::list< WORKSTATION_SET > WORKSTATION_SET_LIST; //工作站列表
(2)
WORKSTATION_SET_LIST::iterator it;
it = std::find_if(
_Module.m_workstationlist.begin(),
_Module.m_workstationlist.end(),
SearchWorkstationByIP(job.Workstation.IP));
if( it != _Module.m_workstationlist.end() )
{
job.Workstation.Name = it->chWorkstationName;
if ( it->chOcrFlag == _T("使用"))
{
job.Workstation.nOcrFlag = 1;
}
else
{
job.Workstation.nOcrFlag = 2;
}
}
(3)
HHWORKSTATION_SET_LIST::iterator it;
it = std::find_if(
_Module.m_workstationlist.begin(),
_Module.m_workstationlist.end(),
SearchWorkstationByIP(job.Workstation.IP));
if( it != _Module.m_workstationlist.end() )
{
job.Workstation.Name = it->chWorkstationName;
CString strOcrFlag = it->chOcrFlag;
if ( strOcrFlag == _T("使用"))
{
job.Workstation.nOcrFlag = 1;
}
else
{
job.Workstation.nOcrFlag = 2;
}
}
上述(2)和(3)中出现两段不同的代码,在(2)中执行到if语句的时候,判断进入else分支执行,在(3)中执行到if语句的时候,判断进入到if分支执行。
根据期望,应该进入到if分支执行,出现的原因如下
分析:
1.参看(1)中的定义可以发现,chOcrFlag是一个char类型的数组, it->chOcrFlag 的类型是char*(数组名是数字的首地址)。所以,在(2)中的if比较中,实际上是用一个 char*类型的数据 和 一个字符串常量 在进行比较,不可能相等
2.参看(3)中的代码发现 CString strOcrFlag = it->chOcrFlag; 这一句的strOcrFlag变量可以接受char*类型的赋值,这是因为类CString的对象在被赋值的时候会自动的将char*类型的变量做一个转换(这个转换是默认),所以达到了效果
3.需要注意的一点是: c和c++语言本身都没有字符串变量这种类型 常用的CString、string都是微软MFC或标准库后来提供的
4.c++中,在进行字符串的比较时,一般使用strcmp进行比较 或者 将字符串赋值给CString或者string等类,再进行比较(如(3)的做法就可以 或者 进行转换(CString)it->chOcrFlag也可以)