过滤.c文件中的注释
任务:将一个.c文件1复制到另一个文件2中,要求过滤掉文件1中的注释。
注释类型:以//开头或者/**/中的注释。用一个函数完成该功能。
基本要求:假设//或者/**/不会出现在printf语句中。
1 #include <stdio.h> 2 /** 3 @author tz 4 @date 2019-04-11 5 */ 6 void filterWrite(FILE* fpin, FILE* fpout); 7 8 int main() { 9 FILE* fpin = fopen("p12in.c", "r"); 10 FILE* fpout = fopen("p12out.c", "w"); 11 if (fpin == NULL || fpout == NULL) 12 exit(0); 13 filterWrite(fpin, fpout); 14 fclose(fpin); 15 fclose(fpout); 16 17 } 18 19 //过滤注释,并写入新文件 20 void filterWrite(FILE* fpin,FILE* fpout) { 21 int ch = fgetc(fpin); 22 int key1 = 0,key2=0;//key作为符合标准的标志,1为//,2为/**/ 23 while (ch != EOF) { 24 if (ch == '/') { 25 int i = 1; 26 ch = fgetc(fpin); 27 if (key1 == 0 &&ch == '/')//排除//与*/同行时改变key2 28 { 29 key1 = 1; 30 i = 0; 31 } 32 if (key1 == 0&&ch == '*') 33 { 34 key2 = 1; 35 ch = fgetc(fpin); 36 i = 0; 37 } 38 if(i==1&&key1==0&&key2==0) 39 { 40 fseek(fpin, -2, SEEK_CUR); 41 ch = fgetc(fpin);//退回使ch==‘/’,把/写入 42 } 43 } 44 45 if ((key1) == 1 && ch == '\n') {//在遇到//后遇到换行符,把换行写入 46 key1 = 0; 47 } 48 if (key1 == 0 && key2 == 0) { 49 fputc(ch, fpout); 50 } 51 if (key2 == 1&&ch=='*') { 52 ch = fgetc(fpin); 53 if (ch == '/') { 54 key2 = 0; 55 } 56 else 57 { 58 fseek(fpin, -2, SEEK_CUR);//退回指向* 59 ch = fgetc(fpin); 60 fputc(ch, fpout); 61 } 62 //把'*'写入文件,fpin指向'*'的下一个字符 63 } 64 //其余情况不写入 65 ch = fgetc(fpin); 66 } 67 }