处理文本时的一个常见用法是将文本视为一系列列,
就像系统日志的列一样,从中提取一个或多个,然后以不同
的方式使用它们,同时丢弃其他部分。令人惊讶的是,C++ 字符串
缺少一个可以自我拆分的方法。替代方法 (strtok()) 实际上不是
C++ 解决方案,因为它涉及到使用 C 数组。另一个问题是它的
底层特性:用户必须发送一个指针来帮助
strtok()。
在这个示例中,我从
string 派生了一个 splitstring 类。如果你有一个 splitstring 并想将它作为字符串使用,你
可以,因为它本身就是一个字符串。但如果你需要拆分字符串,你也可以
拆分它。运行 splitstring 的 split() 方法的输出是一个字符串向量。
这更类似于高级语言,其中字符串具有
split() 方法。
可能的扩展包括基于正则表达式
或固定字符串进行拆分的方法。
为了在更大的项目中使用,类声明应该放在
一个单独的文件中,以便包含在此以及你的代码中(但我假设
你已经知道了)。MAIN 定义也应该被注释掉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
// Class splitstring which adds method split()
// define MAIN if this is a standalone program
#define MAIN 1
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class splitstring : public string {
vector<string> flds;
public:
splitstring(char *s) : string(s) { };
vector<string>& split(char delim, int rep=0);
};
// split: receives a char delimiter; returns a vector of strings
// By default ignores repeated delimiters, unless argument rep == 1.
vector<string>& splitstring::split(char delim, int rep) {
if (!flds.empty()) flds.clear(); // empty vector if necessary
string work = data();
string buf = "";
int i = 0;
while (i < work.length()) {
if (work[i] != delim)
buf += work[i];
else if (rep == 1) {
flds.push_back(buf);
buf = "";
} else if (buf.length() > 0) {
flds.push_back(buf);
buf = "";
}
i++;
}
if (!buf.empty())
flds.push_back(buf);
return flds;
}
#ifdef MAIN
main()
{
// we define a string
splitstring s("Humpty Dumpty sat on a wall. Humpty Dumpty had a great fall");
cout << s << endl;
// splits and displays the vector of strings
vector<string> flds = s.split(' ');
for (int k = 0; k < flds.size(); k++)
cout << k << " => " << flds[k] << endl;
// now taking account of repeated delimiters
cout << endl << "with repeated delimiters:" << endl;
vector<string> flds2 = s.split(' ', 1);
for (int k = 0; k < flds2.size(); k++)
cout << k << " => " << flds2[k] << endl;
}
#endif
|