C/C++ファイルからコメントを削除(c実装)

2089 ワード

/**@author: yangjin  *
 * @date: 2012-7-27
 * @funciton: delete all comments in a c file
 */

#include<stdio.h>
#include<stdlib.h>

main(void)
{
	FILE *fp1, *fp2;
	char c;
	if((fp1 = fopen("1.c", "r")) == NULL)
	{
		perror("open failed!
"); exit(-1); } if((fp2 = fopen("2.c", "w")) == NULL) { perror("open failed!
"); exit(-1); } while(!feof(fp1)) { fscanf(fp1, "%c", &c); /*mean comments may start*/ if(c == '/') { fscanf(fp1, "%c", &c); if(c == '/')//mean '//' { while(c != '
' && !feof(fp1))//delete until end of line fscanf(fp1, "%c", &c); if(c == '
') fprintf(fp2, "%c", c); } else if(c == '*')//mean '/*', so delete until meet '*/' { while(!feof(fp1)) { fscanf(fp1, "%c", &c); if(c == '*') { fscanf(fp1, "%c", &c); if(c == '/')//until meet '*/' break; } } } else { fprintf(fp2, "%c", c); } } /*constant string with "" need to keep*/ else if(c == '\"') { fprintf(fp2, "%c", c);//keep first " do{ fscanf(fp1, "%c", &c); fprintf(fp2, "%c", c); }while(c != '\"' && !feof(fp1)); } /*single constant char with '' need to keep*/ else if(c == '\'') { fprintf(fp2, "%c", c); fscanf(fp1, "%c", &c); fprintf(fp2, "%c", c); fscanf(fp1, "%c", &c); fprintf(fp2, "%c", c); } /*normal c statement*/ else { fprintf(fp2, "%c", c); /* while(c != '/' && c != '\"' && c != '\'' && !feof(fp1)) { fscanf(fp1, "%c", &c); fprintf(fp2, "%c", c); } */ } } return 0; }