[C++]文字列中のコメントをすべて削除する

[](../../i/0/cpp.jpg)

Json パースにpicojsonを使わせていただいているのだけど、

// とか /* ~ */ のコメントが入っているとパースできない。まぁJSONファイルにこういうコメントを入れるのは正しくないんだろうけど使えないと不便。コメントを除去する関数を書いたのでメモ。

ブロックコメントのみを削除する

//  ブロックコメント / * ~ * / をすべて削除する
// インラインコメントは対象外
inline void removeBlockComments( std::string &str ) {
  std::string::size_type posOfHead = 0,posOfTail;
  while ( (posOfHead = str.find("/*", posOfHead) ) != std::string::npos ) {
    posOfTail = str.find("*/", posOfHead + 2);
    str.erase(posOfHead, posOfTail - posOfHead + 2);
  }
  cocos2d::CCLog(str.c_str());
  str.find("hoge", 1);
};

ブロックコメント と インラインコメント を両方削除する

// ブロックコメント / * ~ * / とインラインコメント // ~ をすべて削除
inline void removeComments( std::string &str ) {
  std::string::size_type posOfBlockHead = 0, posOfInlineHead = 0, posOfTail, posOfCR, posOfLF;

  while
    (
     (posOfBlockHead  = str.find("/*", posOfBlockHead))
     != (posOfInlineHead = str.find("//", posOfInlineHead))
     )
  {
    if ( posOfBlockHead < posOfInlineHead ) {
      // ブロックコメントを削除
      posOfTail = str.find("*/", posOfBlockHead + 2);
      str.erase(posOfBlockHead, posOfTail - posOfBlockHead + 2);
      posOfInlineHead = posOfBlockHead;
    } else {
      // インラインコメントを削除
      posOfCR = str.find("\r", posOfInlineHead + 2 );
      posOfLF = str.find("\n", posOfInlineHead + 2 );
      str.erase(posOfInlineHead, posOfCR < posOfLF ? posOfCR - posOfInlineHead : posOfLF - posOfInlineHead);
      posOfBlockHead = posOfInlineHead;
    }
  } // end while
};
Share