**
6-10 **删除C程序中的注释 (15 分)
**
请你编写一个函数,将C语言源程序中的注释全部删去。
函数原型 // 删除注释 void Pack(FILE *src, FILE *dst); 说明:参数 src 和 dst
均为文件指针,其中:src 指示原始程序文件,dst 指示整理后得到的文件。C语言规定:注释以 /* 开始,以 / 结束。注释可以跨行,不允许嵌套。字符串中的 / 和 */ 不是注释。
此外C语言还规定:注释相当于一个空白字符。因此,注释被删除后应补入一个空格。
裁判程序
#include<stdio.h>#include<ctype.h>#include<string.h>
// 删除注释voidPack(FILE *src, FILE *dst);
int main() {
char sname[1024], dname[1024];
FILE *sfile, *dfile;gets(sname); gets(dname); sfile = fopen(sname, "rb"); if (!sfile) { printf("%s 无法打开!\n", sfile); } dfile = fopen(dname, "wb"); if (!dfile) { printf("%s 无法打开!\n", dfile); } if (sfile && dfile) { printf("正在整理..."); Pack(sfile, dfile); puts("整理完成!"); } if (sfile) { fclose(sfile); } if (dfile) { fclose(dfile); } return 0; }
/* 你提交的代码将被嵌在这里 *
voidPack(FILE *src, FILE *dst){char ch, next;while((ch =fgetc(src))!=EOF){if(ch =='\''){// 防止 '\"'........// " 的情况fputc(ch, dst);while((ch =fgetc(src))!=EOF){if(ch =='\\'){fputc(ch, dst);
ch =fgetc(src);fputc(ch, dst);}else{fputc(ch, dst);if(ch =='\'')break;}}}elseif(ch =='\"')// 对字符串里面进行判断,注意 "abc\"def//ghi" 的特殊情况 {fputc(ch, dst);while((next =fgetc(src))!=EOF){if(next =='\\')// 对特殊情况进行判断 {fputc(next, dst);
next =fgetc(src);fputc(next, dst);}else{fputc(next, dst);if(next =='\"')break;}}}elseif(ch =='/')// 判断注释情况 {
next =fgetc(src);if(next =='*')// /**/的情况 {while((next =fgetc(src))!=EOF){if(next =='*'){
next =fgetc(src);if(next =='/')break;}}fputc(' ', dst);continue;}elseif(next =='/')// //的情况 {while((next =fgetc(src))!=EOF)if(next =='\n')break;fputc(' ', dst);fputc('\n', dst);continue;}fputc(ch, dst);// 不是注释则原样输出 fputc(next, dst);}elseif(1)fputc(ch, dst);}}
版权归原作者 2931451523 所有, 如有侵权,请联系我们删除。