2013-01-21 70 views
0

好的,我承认字符串操作在C++方面从来就不是我的强项,尽管我在使用Boost的各种情况下都取得了相当的成功,但我仍然遇到一些问题。使用字符串分隔符标记/分割字符串的最简单方法是什么?

所以,这里是我所需要的(例子中是精确的)...


输入是:

position fen <arg_a1> <arg_a2> ... <arg_aN> moves <arg_b1> <arg_b2> ... <arg_bN>

(当然,对于那些谁是熟悉的与主题,这是一个UCI协议的命令)

我想要做的是:

  • 得到<arg_a1> <arg_a2> ... <arg_aN>(与包含空格)合并为一个字符串(即positionmoves
  • 之间的字符串也得到<arg_b1> <arg_b2> ... <arg_bN>到另一个字符串中(即从moves字符串,直到结束)。

我已经打了很多与Boost::split但很明显这是工作很像strtok(接受字符不串分隔符)。

我应该怎么做?没有我重新发明轮子(我倾向于......经常......大声笑),解决这个特定问题的最简单方法是什么?

建议:显然我可以做到。但我现在所能想到的都很难看。我正在寻找的是一个C++ - 友好的方式...

+3

这似乎很简单。如果你知道“位置”和“移动”这两个词的确切位置,你会怎么做?现在,你将如何找到这些单词在输入字符串中的位置?我敢打赌,如果你把这两样东西放在一起,一个可能的解决方案将是明确的。 –

+0

您可能想要查看此答案 - http://stackoverflow.com/a/236803/701092 – 0x499602D2

+1

+1对于Greg的评论。除此之外,你应该使用'std :: string'函数来做到这一点 - 通过提升分割,正则表达式等将其复杂化是微不足道的好处。 –

回答

0

而这个解决方案(有一些数字的黑客):

// where are 'fen' and 'moves' within the initial string? 
    int fenPos = input.find("fen"); 
    int movesPos = input.find("moves"); 

    // get the exact string but taking into account the position of our initial tokens 
    // as well as their length (e.g. fenPos.length()+1 = 4, etc) 
    string fen = input.substr(fenPos+4,movesPos-fenPos-5); 
    string moves = input.substr(movesPos+6); 

因此,对于输入:

"position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 moves f2f3 e7e6 g2g4",这返回:

fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" 
moves = "f2f3 e7e6 g2g4"