2013-01-21 105 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"