c++中字符串比较随笔

本文通过两个具体的代码示例,探讨了C++中使用不同方式处理字符串比较时可能遇到的问题。特别是当比较char数组与字符串常量的区别,以及如何利用CString类来避免这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中遇到的小问题,写成随笔

 

问题描述:

(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也可以

### C++ 中获取包含空格的字符串 #### 使用 `getline` 函数 为了能够读取带有空格的整个行作为单个字符串,可以使用标准库中的 `std::getline()` 函数。此方式适用于处理以换行为界限的一整行文本。 ```cpp #include <iostream> #include <string> int main(){ std::string line; std::cout << "请输入一行文字(含空格):" << std::endl; std::getline(std::cin, line); std::cout << "您输入的内容是:" << line << std::endl; } ``` 上述代码展示了如何定义一个 `std::string` 类型的对象并借助 `std::getline()` 来捕获用户输入的所有字符直到遇到新行为止[^1]。 #### 利用 `cin.getline` 处理固定长度的字符数组 当目标是从键盘接收特定最大长度内的字符串时,可以选择采用 `cin.getline(char* buffer,int length)` 形式的成员函数。它允许指定缓冲区大小以及预期的最大字节数量减去终止符 `\0` 所占位置后的实际可用容量。 ```cpp #include <iostream> int main(){ const int SIZE = 80; char sentence[SIZE]; std::cout << "请输入一句话(不超过79个字符):" << std::endl; std::cin.getline(sentence, SIZE); std::cout << "您的句子是: " << sentence << std::endl; return 0; } ``` 这里需要注意的是,传递给 `cin.getline()` 的第二个参数应当比分配给字符数组的实际尺寸少一位,以便留出足够的空间用于存储字符串结尾标记`\0`[^3]。 #### 关于 `cin >>` 和其他形式的输入操作符 尽管可以直接运用右移运算符 (`>>`) 对象关联至基本数据类型的实例来进行简单赋值,但是这种方式会在碰到首个空白字符处停止解析过程——这意味着无法直接支持连续多个单词组成的短语或句子录入场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值