C言語でコメント部分を無視する方法
ということで、サンプルコードです。あまりエレガントではないのですが,よろしければ使ってください.
コメントのセパレータは # 以降か /* */ で囲まれた文字です.
それなりに動作はしているようです.
最終的にwbufにコメントではない文字が格納されます.
テストで使ったテキストファイルは次のとおりです.
123#ここは表示されないこと abcdefg #ここは表示されないこと #残り全部コメントアウト hogehoge /*ここは表示されないこと */ /*複数の 行に またがり コメント アウト */ 0.123 /*ここも表示されない みえない わからない */foo/**/ hugahuga #みえない/*当然見えない*/ /*みえない#当然見えない*/ #みえない/*見えない 見えるかも 見えなかった なんでだ? */ /*みえない# 見えるかも */ end
//#以降の文字をコメントとして表示しない //また/*・・・*/で囲まれた間もコメントとして表示しないテスト. #include "stdafx.h" #include#include #define BUF_SIZE 256 //maximam charactor on 1 line. int main(int argc, char* argv[]) { FILE* fp; char rbuf[BUF_SIZE],buf[BUF_SIZE],wbuf[BUF_SIZE],*src,*dst; int flag,i; //file open. fp = fopen("a.txt","r"); if(fp == NULL){ printf("fopen error\n"); return 1; } //file read to end. flag = 0; while(1){ //1 line read from file. memset(wbuf,'\0',sizeof(wbuf)); memset(rbuf,'\0',sizeof(rbuf)); memset(buf,'\0',sizeof(buf)); if(fgets(rbuf,BUF_SIZE-1,fp) == NULL) break; rbuf[strlen(rbuf)-1] = '\0'; //改行コードの削除 //check comment charactor. #if 0 //行内に#が出てくるまでの文字列をコピー //単体のチェック src = rbuf;dst = buf; for(i=0;i < (int)strlen(rbuf) + 1;i++){ if(strncmp(src,"#",strlen("#")) != 0){ *dst = *src; src++;dst++; } } printf("[%s]\n",buf); #endif #if 0 //"/*"から"*/"までをコメントとして認識する //単体のチェック src = rbuf;dst = buf; for(i = 0; i < (int) strlen(rbuf) + 1;i++){ if(flag == 0){ //"/*"を検索する コメントの開始 if(strncmp(src,"/*",strlen("/*")) != 0){ *dst = *src; src++;dst++; }else{ flag = 1; } } if(flag == 1){ //"*/"を検索する コメントの終了 if(strncmp(src,"*/",strlen("*/")) != 0){ src++; }else{ flag = 0; src++;src++; } } } printf("[%s]\n",buf); #endif //二つのコメントパターンを同時にチェック //行内に#が出てくるまでの文字列をコピー src = rbuf;dst = buf; for(i=0;i < (int)strlen(rbuf) + 1;i++){ if(strncmp(src,"#",strlen("#")) != 0){ *dst = *src; src++;dst++; } } //#より前の文字列中のコメントを認識する。"/*"から"*/"までをコメントとして認識する src = buf;dst = wbuf; for(i = 0; i < (int) strlen(buf) + 1;i++){ if(flag == 0){ //"/*"を検索する コメントの開始 if(strncmp(src,"/*",strlen("/*")) != 0){ *dst = *src; src++;dst++; }else{ flag = 1; } } if(flag == 1){ //"*/"を検索する コメントの終了 if(strncmp(src,"*/",strlen("*/")) != 0){ src++; }else{ flag = 0; src++;src++; } } } if(strlen(wbuf) != 0) printf("[%s]\n",wbuf); } fclose(fp); return 0; }
一部に作者が想定していなかった動作をしているのですが,デバッガを上手く使いこなせれていないので,後回しにしています.また修正できたら、載せたいと思います.
追記:わかりました。
読み込んでいるテキストで#でコメントアウトしている以降の文字で*/ とコメント終了しているのですが,その部分が処理されていないので,そのままコメントが継続しているということでした。
読み込むファイルを以下のようにした場合
/*123#456*/ #789/*012 345 */
で最初の行で123はコメントになるのですが,次の#で456の後ろの*/がコメント終了と認識されず、2行目はまるっとコメントになるので,345はコメントの続きと判断されたのでした.
使用する場合は#の後ろに/* */を入れても正しく処理されないのでご注意ください.(笑)