我有这样的需求:我有一个像“-myArg:ArgVal”的字符串。解析C++中的C++字符串
std::string strArg = "-myArg:ArgVal";
现在,我要检查在上面的字符串第一个字符总是“ - ”,如果第一个字符是“ - ”我应该删除它,我应该存储“myArg”和“ArgVal”在两个不同的字符串对象。
我该如何有效地做到这一点?
我有这样的需求:我有一个像“-myArg:ArgVal”的字符串。解析C++中的C++字符串
std::string strArg = "-myArg:ArgVal";
现在,我要检查在上面的字符串第一个字符总是“ - ”,如果第一个字符是“ - ”我应该删除它,我应该存储“myArg”和“ArgVal”在两个不同的字符串对象。
我该如何有效地做到这一点?
试试这个
if (strArg[0] == '-') {
strVar1 = strArg.substr(1, strArg.find(':') - 1);
strVar2 = strArg.substr(strArg.find(':') + 1);
}
当然,我假设,如果字符串与'-'
开始,然后会出现在它':'
与之前和之后的字符。你应该检查一下,因为如果没有它可能会导致错误
添加一个空字符串检查,strArg [0]不保证工作 – ognian 2011-03-29 13:39:31
看看std::string::substr()
和std::string::find()
。
最具扩展性和可靠性的方法是通过regular expressions。推荐的库是Boost.Regex
std :: string具有您需要的功能。您可以使用string::at
检查第一个字符,并使用string::substr
创建子字符串。擦除单个字符的工作方式与此相同。
查看c++ reference了解更多信息。
为什么你会为这样的事情担心“效率”?你多久需要这样做?它看起来像一个命令行参数,这往往意味着解析很少发生。 – unwind 2011-03-29 13:36:40
@unwind:效率可以通过代码行数或程序员分钟数以及CPU时间来衡量。 – 2011-03-29 13:38:43
在这种情况下更好地清晰。初始化代码可能相当低效,因为它只运行一次。只有对运行时间最长的东西进行优化,在你到达正确运行程序并通过所有测试的时刻,你甚至不用担心。 – 2011-03-29 13:40:36