0

XML ファイルの行を含む文字列を解析しようとしています。

std::string temp = "<Album>Underclass Hero</Album>";
int f = temp.find(">");
int l = temp.find("</");
std::string _line = temp.substr(f + 1, l-2);

これは、解析された文字列を実際に返す関数のコードの一部です。私が期待したのは、それがUnderclass Heroを返すことでした。代わりに、Underclass Hero< /Alb
を取得しまし た (ここでは、'<' と '/' の間にスペースを入れています。これらを一緒に書くことができなかったからです)。

私は std::string::find を数回調べましたが、存在する場合は最初の一致の最初の文字の位置を返すと常に言いました。ここでは、文字列の最後の文字が得られますが、変数lのみです。
fは問題ありません。

std::string::find へのリンク

誰が私が間違っているのか教えてもらえますか?

4

3 に答える 3

5

substrは、終了位置ではなく、長さを 2 番目のパラメーターとして受け取ります。試す:

temp.substr(f + 1, l-f-1);

また、実際の XML パーサーの使用を検討してください。自分で試したり、他の不適切な方法で試したりしないでください。

于 2013-04-05T17:37:39.877 に答える
5

2 番目の引数は、抽出する部分文字列の長さを取ります。この方法でコードを修正できます。

#include <string>
#include <iostream>

int main()
{
    std::string temp = "<Album>Underclass Hero</Album>";
    int f = temp.find(">");
    int l = temp.find("</");
    std::string line = temp.substr(f + 1, l - f - 1);   
    //                                    ^^^^^^^^^
}

これが実際のです。

また、 などの名前にも注意して_lineください。C++11 標準のパラグラフ 17.6.4.3.2/1 によると:

[...] アンダースコアで始まる各名前は、グローバル名前空間で名前として使用するために実装に予約されています。

于 2013-04-05T17:38:35.790 に答える
3

このようにしないでください!

XML ファイルの ' '' の解析は遅かれ早かれ失敗します。例: 以下は有効な XML ですが、コードは失敗します。

<Album>Underclass Hero<!-- What about </ this --></Album>

PS:可能な場合は以下を使用してください。const

std::string const temp = ...
// ...
std::string const line = ...
于 2013-04-05T19:29:58.767 に答える