好吧,我承认字符串操作在C ++方面从来就不是我的强项,虽然我在各种情况下只是通过使用Boost取得了相当大的成功,但我仍然遇到了一些问题。
所以,这就是我需要的(例子是精确的)......
输入为:
position fen <arg_a1> <arg_a2> ... <arg_aN> moves <arg_b1> <arg_b2> ... <arg_bN>
(对于那些熟悉该主题的人来说,这是UCI协议的命令)
我想做的就是:
<arg_a1> <arg_a2> ... <arg_aN>
(包含空格)放入一个字符串(即position
和moves
之间的字符串<arg_b1> <arg_b2> ... <arg_bN>
转换为另一个字符串(即从moves
到结尾的字符串)。我与Boost::split
玩过很多次,但显然这与strtok
非常相似(接受字符和不是字符串分隔符)。
我应该怎么做?什么是解决这个特殊问题的最简单的方法,没有我重新发明轮子(我倾向于做...经常...大笑)?
提示:显然我可以做到。但我现在能想到的只是非常难看。我正在寻找的是一种C ++友好的方式......
答案 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"