C++通用功能函数(通过;/,进行分割取出字符串、模糊搜索等)

 1.命名规则(存在重名进行加_1)

map<CString, int> m_NameCountMap;


CString ThkabcMng::FindDuplicateName(CString strECName)
{
	// 检查是否存在重复的外部几何名称
	if (m_NameCountMap.find(strECName) != m_NameCountMap.end())
	{
		// 存在重复,自动添加计数后缀
		m_NameCountMap[strECName]++;
		int nCount = m_NameCountMap[strECName];
		CString strCount;
		strCount.Format(_T("%d"), nCount);
		strECName = strECName + _T("_") + strCount;
		/*m_NameCountMap[strECName] = nCount + 1;*/
	}
	else
	{
		// 不存在重复,直接添加到计数表中
		m_NameCountMap[strECName] = 0;
	}

	return strECName;
}

2.递归查找函数(找到最大的数字)

int ThkabcMng::FindMaxId(Thk501ToolAsmComp* pComp)
{
	if (pComp == NULL)
	{
		return -1;
	}
	int nMaxNodeId = pComp->m_nNodeCode;
	for (int i = 0; i < (int)pComp->m_arrComp.GetCount(); i++)
	{
		ThkabcComp* pAsm = pComp->m_arrComp[i];
		if (pAsm == NULL)
		{
			continue;
		}
		int nChildMaxNodeId = FindMaxId(pAsm);
		if (nChildMaxNodeId > nMaxNodeId)
		{
			nMaxNodeId = nChildMaxNodeId;
		}
	}
	return nMaxNodeId;
}

 3.模糊搜索函数

bool ThkabcMng::FilterSearch(const CString strName, const CString strKey)
{
	int strNameIndex = 0; // 当前字符串位置的索引
	int keyIndex = 0; // 当前模式位置的索引
	int strMatchIndex = 0; // 上一次匹配 "*" 的字符串位置索引
	int patternMatchIndex = -1; // 上一次匹配 "*" 的模式位置索引,默认为无效位置

	while (strNameIndex < strName.GetLength())
	{
		if (keyIndex < strKey.GetLength() && (strKey[keyIndex] == strName[strNameIndex] || strKey[keyIndex] == '*'))
		{
			if (strKey[keyIndex] == '*')
			{
				patternMatchIndex = keyIndex; // 记录当前 "*" 的模式位置索引
				keyIndex++; // 模式位置索引向后移动一位
				strMatchIndex = strNameIndex; // 记录当前匹配 "*" 的字符串位置索引
			}
			else
			{
				keyIndex++; // 模式位置索引和字符串位置索引都向后移动一位
				strNameIndex++;
			}
		}
		else if (patternMatchIndex != std::string::npos)
		{
			keyIndex = patternMatchIndex + 1; // 模式位置索引回到上一次匹配 "*" 的位置的下一位
			strMatchIndex++; // 字符串位置索引向后移动一位
			strNameIndex = strMatchIndex; // 字符串位置索引回到上一次匹配 "*" 的位置的下一位
		}
		else
		{
			return false; // 如果当前字符不匹配且没有上一次匹配 "*" 的记录,则返回 false
		}
	}

	while (keyIndex < strKey.GetLength() && strKey[keyIndex] == '*')
	{
		keyIndex++; // 如果模式中剩余的字符都是 "*",则继续向后移动模式位置索引
	}

	return (keyIndex == strKey.GetLength()); // 如果模式位置索引等于模式长度,说明字符串完全匹配模式,返回 true;否则返回 false

}

4.通过;或者,等等进行分割字符串

#include <afx.h>
#include <iostream>

int main() {
    CString inputString = _T("abc_abc_P_*");
    CString delimiter = _T("*");

    // 找到星号的位置
    int pos = inputString.Find(delimiter);

    if (pos != -1) {
        // 提取星号之前的子串
        CString prefix = inputString.Left(pos);
        std::wcout << _T("前缀: ") << prefix.GetString() << std::endl;

        // 提取星号之后的子串
        CString suffix = inputString.Mid(pos + delimiter.GetLength());
        std::wcout << _T("后缀: ") << suffix.GetString() << std::endl;
    } else {
        std::wcout << _T("未找到星号") << std::endl;
    }

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行为艺术家Zzz

新人 求鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值