// || /**/
同じく、今日友人に聞いた、ソースコードからコメントを除外してファイルの中身を表示するプログラム
久々にC言語で書いてみた
ファイル操作は、なんだかんだ言って、Cが一番慣れている
何も推敲せず、思いついたまま書いて言ったので全く綺麗じゃない。
char*buf
でも宣言して処理したらもっと綺麗になったと思うが、せいぜい必要なのは連続した二文字と、””、’’のときの処理くらいなので。
”や’
を見つけた時は、quot変数に1を代入、もう一度出てきたら0に戻す、というやり方で、/や*が、文字列リテラル内か外かを判断
因みに、私の環境、VC++では、コメントの入れ子はサポートされていなかったので、このソースコードでもサポートしていません。
あと、一つだけ課題があるとすれば、
文字列リテラルの中で、
\"のようにして”や’を使用している場合。
この場合については、下のソースコードでは対応していません。
まあ、quot==1のもとでの条件分岐を増やすだけですけど
..........あれ?
でもこのソースコード内にも、そのように記述している個所があるけど、実行結果がちゃんと出力されてるから問題ないのか
あ、なんだ、やった笑
#include<stdio.h> #define N 512 int main(){ FILE* fp; char c1,c2,str[N]; int quot = 0; if((fp = fopen("main.cpp","r"))==NULL){ printf("cannot open that file"); //エラー処理 return 1; } rewind(fp); while((c1 = fgetc(fp))!=EOF){ if(c1=='\"' || c1=='\'') quot = (quot+1) % 2; if(c1=='/' && quot == 0){ /*ここで、コメントの処理を行う*/ c2 = fgetc(fp); if(c2 == '/'){ fgets(str,N,fp); printf("\n"); } if(c2 == '*'){ while((c1 = fgetc(fp))!=EOF){ if(c1 == '*'){ c2 = fgetc(fp); if(c2 == '/') break; } } } } else printf("%c",c1); } getchar(); fclose(fp); printf("\n\n\n\n/*OK!*/"); return 0; }
実行すると、ちゃんと途中に挟んだコメントは非表示になり、
最後のprintf関数内の/*OK!*/は、ちゃんとそのまま表示されました。
所要時間、7,8分くらい
うん、昔に比べたら成長したということで笑