#include "stdio.h" #define MAXTEXT 1024 unsigned char (*scanMode)(); // ■文字列スキャンモード unsigned char scanInit(); //  初期モード unsigned char scanString(); //  文字列中モード unsigned char scanESC(); //  文字列外エスケープモード(日本語2バイト目を含む) unsigned char scanStringESC(); //  文字列内のエスケープモード unsigned char text[MAXTEXT]; // ■データ領域 入力テキスト unsigned char noComm[MAXTEXT]; //        注釈を外したテキスト int ptr, err; //  ポインタ()、エラーコード unsigned char scanStringESC(){ // ■文字列中のエスケープモード err=0; if(text[ptr]<0x20) { err=1; if(text[ptr]!=0) ptr++; return ' ';} scanMode=scanString; return text[ptr++]; // 次を文字列中モードとし現文字を返却 } unsigned char scanESC(){ // ■文字列外のエスケープモード err=0; if(text[ptr]<0x20) { err=2; if(text[ptr]!=0) ptr++; return ' ';} scanMode=scanInit; return text[ptr++]; // 次を初期モードとして現文字を返却 } unsigned char scanString(){ // ■文字列中モード err=0; if(text[ptr]==0||text[ptr]==0x1A){ err=3; scanMode=scanInit; return '\"';} if(text[ptr]=='\n') { err=4; ptr++; scanMode=scanInit; return '\"';} if(text[ptr]=='\"') scanMode=scanInit; // 二重引用符のとき次は初期モード else if(text[ptr]=='\\'|| text[ptr]>=0x80) // \または日本語のとき、次は scanMode=scanStringESC; // 文字列内エスケープモード return text[ptr++]; } unsigned char scanLineEnd(){ // ■行終わりまでスキャンし、空白を返却する。 while(text[ptr]!=0 && text[ptr]!='\n') ptr++; if(text[ptr]!='\n') ptr++; err=0; return ' '; } unsigned char scanCommEnd(){ // ■"*/"までをスキャンし、空白を返却する for(err=0 ; text[ptr]!=0; ptr++) if(text[ptr]=='*' && text[ptr+1]=='/'){ptr+=2; return ' ';} err=5; return ' '; } unsigned char scanInit(){ // ■初期モード(0x80より大きいとき日本語の1バイト目) err=0; if(text[ptr]<=0x20) {if(text[ptr]!=0) ptr++ ; return ' ';}// 空白とみなす if(text[ptr]==0x80 && text[ptr+1]==0x40){ ptr+=2; return ' ';}// 全角スペース(LAで無視) if(text[ptr]=='\\'||text[ptr]>=0x80) { scanMode=scanESC; return text[ptr++];} if(text[ptr]=='/' && text[ptr+1]=='/') return scanLineEnd();// 行エンドまで無視 if(text[ptr]=='/' && text[ptr+1]=='*') return scanCommEnd();// コメント内を無視 if(text[ptr]=='"') { scanMode=scanString; return text[ptr++];} return text[ptr++]; } int inputAllText(unsigned char Text[]){ // ■キーボードからEOF([CTRL]Z)までを読み込む unsigned char c;int i=0; while((c=getchar())!=0xFF)Text[i++]=c; Text[i++]=0; return i; } void printAllText(char Title[], unsigned char Text[]){ // ■テキストの表示 printf("\n[%s]\n%s\n",Title,Text); for(int i=0; Text[i]!=0;i++){if((i%16)==0)printf("\n"); printf(" %02X", Text[i]);} } int deleteComment(unsigned char NoComm[], unsigned char Text[]){// ■全テキストからコメントを削除 int i=0; ptr=0; scanMode=scanInit; while(text[ptr]!=0)NoComm[i++]=scanMode(); NoComm[i++]=0; return i; } int main(){ // ■テスト用メイン int num; ptr = inputAllText(text) ; printAllText("原文", text); num = deleteComment(noComm,text); printAllText("結果", noComm); printf("\n\n[結果の文字数 = %d]",num); getchar(); }