2016-03-25 19 views
1

複数の区切り文字を使用して文字列を個々の文字列に分割する方法を教えてください。 現在、デフォルトの空白区切り文字が使用されています。最初と最後の文字が英数字以外の場合は手動で削除します。C++複数の区切り文字を使用して文字列を分割する方法

ここでの目標は、.cppファイルを読み込み、C++の予約語ではないすべてのユーザーIDに対して解析することです。

それは良性の例のために働いていますが、このようなもののために:

OrderedPair<map_iterator, bool> insert(const value_type& kvpair) 

それが機能していません。 OrderedPairを独自の単語、map_iteratorに分割して、それ自身、bool、insert、const、value_type、およびkvpairを個々の単語に分割したいと思っています。

「<」、(&)。> *「文字列ストリームの区切り文字として使用するにはどうすればよいですか?

while (getline(inFile, line)) { 
    isComment = false; 
    stringstream sstream(line); 
    while (sstream >> word) { 
     isCharLiteral = false; 

     if (!isComment) { 
      if (word[0] == '/' && word[1] == '/') 
       isComment = true; 
     } 

     if (!isMultilineComment) { 
      if (word[0] == '/' && word[1] == '*') 
       isMultilineComment = true; 
     } 

     if (!isStringLiteral) { 
      if (word[0] == '"') 
       isStringLiteral = true; 
     } 

     if (!isCharLiteral) { 
      if (word[0] == '\'' && word.back() == '\'') 
       isCharLiteral = true; 
     } 

     if (isStringLiteral) 
      if (word.back() == '"') 
       isStringLiteral = false; 

     if (isMultilineComment) 
      if (word[0] == '*' && word[1] == '/') 
       isMultilineComment = false; 

     if (!isStringLiteral && !isMultilineComment && !isComment && !isCharLiteral) { 
+0

boost :: tokenizer http://www.boost.org/doc/libs/1_57_0/libs/tokenizer/tokenizer.htm – Ajay

+0

最初に、文字リテラルがあります。あなたはASCIIテーブルを覚えておく必要はありません... – LogicStuff

+0

charリテラルよりもascii番号を使用しないようにアドバイスする具体的な理由はありますか?また、この特定のタスクでは、boost :: tokenizerのような他の外部クラスを使用することはできません。文字列クラスを含む標準のC++だけが含まれています。 – momonkey

答えて

0

あなたが標準ライブラリを使用することができます場合は、私はあなたの文字列をトークン化するstd::strtok()を使用してお勧めします。あなたは好きな区切り文字をstrtok()に渡すことができます。それについての参考資料はhereです。

strtokが正しく動作するためにあなたは、stringデータ型を使用しているので、あなたは十分な長さのNULL終了文字列にあなたの文字列をコピーする必要があり、その後、そのアレイ上strtok()を呼びたいです。

+0

どうすればnull終端されたchar配列にコピーできますか? char * str [] = word;動作していないようです。 – momonkey

+0

'char配列[bigEnough]; strcpy(array、line.c_str()); ' – Logicrat

0

C++ は、最も一般的な使用例についての基本的な入力方法のみを提供します。ここでは、std::stringfind_first_offind_last_ofの方法で直接処理して、区切り文字または非区切り文字を識別することができます。良い古いstrtokの近くに何かを構築するのは簡単ですが、直接\0を解析された文字列に書くのではなく、std::stringに直接作用します。

しかし、あなたが達成しようとしているため、あなたはあなたがしたい文字のインスタンスを置き換えるために正規表現を使用することができ、あなたがindentifiers

+0

オリジナルの投稿を更新しました。コメント、複数行のコメント、char/stringリテラルのチェックがあります。だから、strtok()を使ってそれをトークン化することは、私にとっては良い考えではないようです。 – momonkey

+0

@momonkey重要な構文解析が必要な場合は、おそらく独自のトークナイザを書くべきです。私はいくつかの複数文字の区切り文字があることがわかります。私の意見では、これはカスタムトークナイザの表示です。ですから、私は 'stringstream 'のさまざまな区切り文字を使う能力に頼るのではなく、一度に1行ずつ読み、それを分割することを提案しています。 – vacuumhead

0

を検索してはいけませんアカウントコメント、文字列litteral、マクロとプラグマを考慮に入れる必要があります空白で区切り文字にする。次に、既存のホワイトスペース分割設定を使用します。 http://en.cppreference.com/w/cpp/regex

正規表現で余分なことを気にせず、必要なものにマッチさせ、マッチを繰り返してください。

関連する問題