使用字符串分隔符标记/拆分字符串的最简单方法?

时间:2013-01-21 01:18:40

标签: c++ parsing boost split token

好吧,我承认字符串操作在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 ++友好的方式......

1 个答案:

答案 0 :(得分: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"