wvogel日記

自分用の技術備忘録が多めです.

// || /**/

同じく、今日友人に聞いた、ソースコードからコメントを除外してファイルの中身を表示するプログラム


久々に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分くらい
うん、昔に比べたら成長したということで笑