这里顺带回顾下C++ std::string常见的字符串查找的方法:
std::string::find 用于在字符串中查找指定的子字符串 。如果找到了子串,则返回子串的起始位置,否则返回std::string::npos 。用于各种字符串操作,例如判断子字符串是否存在、获取子字符串的位置等 。通过结合其他成员函数和算法,可以实现更复杂的字符串处理逻辑 。
std::string::find_first_of 用于查找字符串中第一个与指定字符集合中的任意字符匹配的字符,并返回其位置 。可用来检查字符串中是否包含指定的某些字符或者查找字符串中第一个出现的特定字符
std::string::find_first_not_of 用于查找字符串中第一个不与指定字符集合中的任何字符匹配的字符,并返回其位置 。
std::string::find_last_of 用于查找字符串中最后一个与指定字符集合中的任意字符匹配的字符,并返回其位置 。可以用来检查字符串中是否包含指定的某些字符 , 或者查找字符串中最后一个出现的特定字符
std::string::find_last_not_of 用于查找字符串中最后一个不与指定字符集合中的任何字符匹配的字符,并返回其位置 。
除了以上几个方法外,还有查找满足指定条件的元素std::find_if,
std::find_if 是 C++ 标准库中的一个算法函数,用于在指定范围内查找第一个满足指定条件的元素,并返回其迭代器 。需要注意的是 , 使用 std::find_if 函数时需要提供一个可调用对象(例如 lambda 表达式或函数对象),用于指定查找条件 。
std::vector<int> vec = {1, 2, 3, 4, 5};auto it = std::find_if(vec.begin(), vec.end(), [](int x) { return x % 2 == 0; });if (it != vec.end()) { std::cout << "Found even number: " << *it << std::endl;} 此外,在业务开发有时候也会遇到需要C++ boost库支持的starts_with、ends_with 。如果用C++标准库来实现 , 常规编写方法可如下:
bool starts_with(const std::string& str, const std::string& prefix) { return str.compare(0, prefix.length(), prefix) == 0;}bool ends_with(const std::string& str, const std::string& suffix) { if (str.length() < suffix.length()) { return false; } else { return str.compare(str.length() - suffix.length(), suffix.length(), suffix) == 0; }}以上代码中,starts_with 函数和 ends_with 函数分别用于检查字符串的前缀和后缀 。两个函数内部都使用了 std::string::compare 方法来比较字符串的子串和指定的前缀或后缀是否相等 。如果相等,则说明字符串满足条件,返回 true;否则返回 false 。
std::string与std::wstring转换对字符串进行处理是一个很常见的业务场景 , 尤其是C++客户端开发 , 我们经常需要在窄字符串std::string与宽字符串std::wstring之间进行转换,有时候一不小心就会出现各种中文乱码 。还有就是一提到窄字符串与宽字符串互转以及时不时出现的中文乱码,很多人就犯晕 。
在 C++ 中,std::string和std::wstring之间的转换涉及到字符编码的转换 。如果在转换过程中出现乱码,可能是由于字符编码不匹配导致的 。要正确地进行std::string 和 std::wstring之间的转换,需要确保源字符串的字符编码和目标字符串的字符编码一致,避免C++中的字符串处理乱码,可以使用Unicode编码(如UTF-8、UTF-16或UTF-32)来存储和处理字符串 。
我们想要处理或解析一些Unicode数据,例如从windows REG文件读?。?褂胹td::wstring变量更能方便的处理它们 。例如:std::wstring ws=L"中国a"(6个八位字节内存:0x4E2D 0x56FD 0x0061),我们可以使用ws[0]获取字符“中”,使用ws[1]获取字符“国”,使用ws[2]获取字符“国”获取字符 'a' 等,这个时候如果使用std::string,ws[0]拿出来的就是乱码 。
此外还受代码页编码的影响(比如VS可以通过文件->高级保存选项->编码 来更改当前代码页的编码) 。
下面是一些示例代码,演示了如何进行正确的转换,针对Windows平台 , 官方提供了相应的系统Api(MultiByteToWideChar):
std::wstring Utf8ToUnicode(const std::string& str) { int len = str.length(); if (0 == len) return L""; int nLength = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), len, 0, 0); std::wstring buf(nLength + 1, L''); MultiByteToWideChar(CP_UTF8, 0, str.c_str(), len, &buf[0], nLength); buf.resize(wcslen(buf.c_str())); return buf;}std::string UnicodeToUtf8(const std::wstring& wstr) { if (wstr.empty()) { return std::string(); } int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], static_cast<int>(wstr.size()), nullptr, 0, nullptr, nullptr); std::string str_to(size_needed, 0); WideCharToMultiByte(CP_UTF8, 0, &wstr[0], static_cast<int>(wstr.size()), &str_to[0], size_needed, nullptr, nullptr); return str_to;}
推荐阅读
- 沙滩裤最常见的面料有哪些 沙滩裤首选什么面料
- 7种常见水果,秋天吃正是好时候,健康促消化对吗
- 常见鸟类的本领和特征 常见鸟类的本领
- 八个 C++ 开源项目,帮助初学者进阶成长
- 买车分期与全款:内行揭秘,新手购车避坑指南
- 常见泵原理图 泵的结构与原理图
- U盘使用过程中常见问题及其解决方案
- SSL协议是什么?关于SSL和TLS的常见问题解答
- 衣服的常见面料,十大常见服装面料优缺点分析
- C++多线程编程:解锁性能与并发的奥秘
