2011-03-29 80 views
0

我有这样的需求:我有一个像“-myArg:ArgVal”的字符串。解析C++中的C++字符串

std::string strArg = "-myArg:ArgVal"; 

现在,我要检查在上面的字符串第一个字符总是“ - ”,如果第一个字符是“ - ”我应该删除它,我应该存储“myArg”和“ArgVal”在两个不同的字符串对象。

我该如何有效地做到这一点?

+6

为什么你会为这样的事情担心“效率”?你多久需要这样做?它看起来像一个命令行参数,这往往意味着解析很少发生。 – unwind 2011-03-29 13:36:40

+0

@unwind:效率可以通过代码行数或程序员分钟数以及CPU时间来衡量。 – 2011-03-29 13:38:43

+0

在这种情况下更好地清晰。初始化代码可能相当低效,因为它只运行一次。只有对运行时间最长的东西进行优化,在你到达正确运行程序并通过所有测试的时刻,你甚至不用担心。 – 2011-03-29 13:40:36

回答

3

试试这个

if (strArg[0] == '-') { 
    strVar1 = strArg.substr(1, strArg.find(':') - 1); 
    strVar2 = strArg.substr(strArg.find(':') + 1); 
} 

当然,我假设,如果字符串与'-'开始,然后会出现在它':'与之前和之后的字符。你应该检查一下,因为如果没有它可能会导致错误

+4

添加一个空字符串检查,strArg [0]不保证工作 – ognian 2011-03-29 13:39:31

1

看看std::string::substr()std::string::find()

1

最具扩展性和可靠性的方法是通过regular expressions。推荐的库是Boost.Regex

+1

或在C++ 0x,'std :: tr1 :: regex'或'std :: regex' – Benoit 2011-03-29 13:41:02

+0

我喜欢正则表达式,但这是在这种情况下,OP需要什么过度杀伤力。用手提钻在墙上放一个相框。 – 2011-03-29 14:15:06

+0

@John你可以这么说,你会说得对。我会选择正则表达式,因为当你需要修改这个解析器时,或者使它更加复杂时,你将拥有所有你需要的东西。 – ognian 2011-03-29 15:16:06

0

std :: string具有您需要的功能。您可以使用string::at检查第一个字符,并使用string::substr创建子字符串。擦除单个字符的工作方式与此相同。

查看c++ reference了解更多信息。