有人能给我一些关于从可变长度输入字符串中提取参数名称和参数值的最佳/优雅方法的提示吗?我需要提取这些值以便将它们写在另一个 .txt 文件中。我应该使用正则表达式吗?使用它们的方法是什么?
我知道如何做到这一点,但使用 for 循环和各种 if-then 条件,这是一团糟。我需要的是在哪里可以找到一些可以帮助我的内置函数。
谢谢!
在这种情况下,正则表达式是不必要的开销。一个字符std::string::find
就足以完成这项工作。假设每个参数(即使是第一个参数)都以 开头#
,该值是可选的(默认为""
)并且始终省略尾随#
,您可以执行以下操作:
std::string pstr = ...; // the parameter string
typedef std::pair<std::string, std::string> Param;
std::vector<Param> params;
std::size_t pos = pstr.find('#');
std::size_t next = pstr.find('#', pos);
while (pos != std::string::npos) {
std::string param, value;
std::size_t sep_pos = pstr.find('~', next);
if (sep_pos != std::string::npos) {
value = pstr.substr(sep_pos + 1, next - sep_pos - 1);
param = pstr.substr(pos + 1, sep_pos - pos - 1);
} else {
param = pstr.substr(pos + 1, next - pos - 1);
}
params.push_back(Param(param, value));
}
请注意,这std::strtok
是一个糟糕的建议。该函数是不安全的,不应在普通 C++ 代码中使用。
假设存储的初始文本如下:
param1:value1;param2:value2;param3:value3.....
最好的方法是使用StringTokenizer
. java
代码如下所示:
StringTokenizer sT=new StringTokenizer(InputString, ";");
while(sT.hasMoreTokens())
{
String Pair=sT.nextToken();
String sT2=new StringTokenizer(Pair, ":");
String param=sT2.nextToken();
String value=sT2.nextToken();
System.out.println(param+" "+value);
}
另一方面,如果您想在 中严格编码C++
,那么您可以使用 c++ 计数器部分,
strtok
函数。更多请看这里