2017-05-16 18 views
-3

だから、私は、この行のすべての書籍(タイトル、作者、ジャンル)に関する情報を含む'[title]' '[author]' '[genre]'のテキストファイルを持っています。この行を3つの異なる文字列に分割して、それぞれがタイトル/著者/ジャンルであるようにするにはどうすればよいですか?C++のテキストファイルの1行から複数​​の文字列を抽出する

+4

[解析(スプリット)Cの文字列++ストリング区切り文字(標準C++)を使用して(の可能性のある重複http://stackoverflow.com/questions/14265581/parse-split-a-string-in-c -using-string-delimiter-standard-c) –

+0

標準C++ライブラリでサポートされているregexも使用できます。答えの下のstrtokは、Cの文字列だけで、ANSIではaのみで動作します。正規表現を試してみたいのであれば、それを学ぶためのオンラインエディタがあります:https://regex101.com/ – Swift

+0

文字列は '、yes? '' 20、000 Leagues Under the Sea '' Jules Verne '' science fiction''のような行が正しいでしょうか? – user4581301

答えて

-2
int main() { 

char str[]="[title] [author] [genre]"; 
char *pch = strtok (str," []"); 
while (pch != NULL) 
{ 
    cout<<pch<<"/"; 
    pch = strtok (NULL, " []"); 

} 

return 0; 
} 

出力: タイトル/著者/ジャンル/

+0

これはCの関数であり、問​​題の文字列がマルチバイトエンコーディングを使用する場合、このアプローチでは問題が発生する可能性があります。 C++は楽器を持っています – Swift

+1

@Swift絶対に。 しかし、ファイル –

+1

1970内のデータを読み取るための適切な構造を選択することができます..... –

-1

あなたは、文字列内のすべての一致を列挙するsregex_token_iteratorを使用し、その後、そのルールの正規表現を定義することができる場合は、任意のルールに従って文字列を分割することができます。この例では、すべてのマッチをベクターに保存します。

#include <vector> 
#include <iostream> 
#include <string> 
#include <regex> 

std::vector<std::string> get_params(const std::string& sentence) 
{ 
    std::regex reg("([^\']*)"); 

    std::vector<std::string> names(
     std::sregex_token_iterator(sentence.begin(), sentence.end(), reg), 
     std::sregex_token_iterator()); 
    return names; 
} 

int main() 
{ 
    std::string str = "\'String1\' \'String2\' \'String3\'"; 
    std::vector<std::string> v = get_params(str); 

    for (auto const& s : v) 
      std::cout << s << '\n'; 
} 
関連する問題