一、背景
这里我们需要拆分一个 wstring 类型的字符串,比如 22.33mm ,我们需要将前面的数值部分 22.33 与单位部分 mm 拆开,分别存储。
二、方法:使用
1. find_last_not_of
find_last_not_of函数来查找字符串中最后一个不匹配指定字符集的位置。
具体解释如下:
(1) find_last_not_of函数是std::wstring类的成员函数,用于在字符串中从后往前查找第一个不在指定字符集内的字符。
(2) 函数的参数是一个表示字符集的字符串。我们可以传递了L"0123456789."作为参数,表示数字和点号。这意味着函数将查找最后一个不是数字和点号的字符。
(3) find_last_not_of函数返回一个位置索引,指示找到的字符在字符串中的位置。如果找不到匹配的字符,函数将返回std::wstring::npos。
2. find_first_not_of
find_first_not_of函数是C++的字符串查找函数,用于从字符串的起始位置开始查找第一个不在指定字符集内的字符。下面是find_first_not_of函数的用法:
size_t find_first_not_of(const std::wstring& str, size_t pos = 0);
参数说明:
str:要在其中查找的字符串。pos:要开始查找的位置,默认为0,即从字符串的起始位置开始查找。
返回值:
- 如果找到了第一个不在指定字符集内的字符,则返回该字符在字符串中的位置索引。
- 如果没有找到不在指定字符集内的字符,则返回
std::wstring::npos。
所以我们可以使用 find_first_not_of 函数用于查找单位部分的起始位置。通过找到第一个不是数字和点号的字符,我们可以确定单位部分的开始位置,并从该位置开始提取单位部分,该位置之前就是数值部分。
具体代码如下所示:
#include <iostream>
#include <string>
int main() {
std::wstring input = L"22.33mm";
// 查找单位部分的起始位置
size_t unitPos = input.find_first_not_of(L"0123456789.");
// 提取数值部分和单位部分
std::wstring numberPart = input.substr(0, unitPos);
std::wstring unitPart = input.substr(unitPos);
// 输出结果
std::wcout << L"数值部分: " << numberPart << std::endl;
std::wcout << L"单位部分: " << unitPart << std::endl;
return 0;
}
这样就可以成功拆分出数值部分: 22.33 和 单位部分: mm 。
其中:substr() 是用于从一个字符串中提取子字符串的函数。
substr() 函数有两个版本:
- 使用两个参数的版本:
substr(pos, len),其中pos是起始位置,len是要提取的子字符串长度。返回从pos开始的长度为len的子字符串。上面的std::wstring numberPart = input.substr(0, unitPos);就是提取input("22.33mm");中从0开始长度为unitPos的字符串,因为下标从0开始,所以所以mm的第一个m的位置unitPos,刚好就是前面22.33的长度。 - 使用一个参数的版本:
substr(pos),其中pos是起始位置。返回从pos开始一直到字符串末尾的子字符串。这里提取单位的操作input.substr(unitPos);就是提取从mm的第一个m的位置unitPos到字符串末尾的子字符串。