今天是C语言课后的一道题目,感受比较有趣,刚开始一直没有相通,花了很长时间,后来想到了一种解决办法,在这里分享一下,有其余办法的也可在评论区留言你们交流。web
删除文件中的注释:将C语言源程序(hello.c)文件中的全部注释去掉后存入另外一个文件(new_hello.c)svg
注释有两种,多行注释(“/* /”)和单行注释(“// ”)。
解决思路以下:
逐个对文件一中的字符进行分析,遇到字符’/‘进入下一步分析,不然直接将该字符存入文件二中。
当前一个字符为’/’,第二个字符可分为三种状况,
①第二个字符为’/’,则此时注释符为单行注释,此时文件一中该行剩余的字符都将再也不输入文件二,直到遇到换行符结束循环。
②第二个字符为’’,则此时注释符为多行注释,这种状况下,须要找到“/”,直到“/”以前的字符都将再也不输出到文件二。这种状况下我想了很长时间如何实现,个人解决办法是,读到’'后将使用fgets函数每次读入两个字符,使用strstr函数判断读入的字符是否为“/”,如果则退出循环,不然将文件指针后移一位,而后接着读入两个字符进行判断(主要是为了防止“**/”的状况)。
③第二个字符是其余字符,此时第一个字符不构成注释符,使用fseek函数将文件指针后移两位,从新读写‘/’ 。函数
/*将原文件中的注释删除后存储到另外一个文件中*/ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE *fp1, *fp2; char ch; char comment[2]; /*打开读出数据的文件*/ if((fp1 = fopen("F:\\201801\\C语言\\第十二次做业\\hello.c", "r")) == NULL) { printf("File open error!\n"); exit(0); } /*打开写入数据的文件*/ if((fp2 = fopen("F:\\201801\\C语言\\第十二次做业\\new_hello.c", "w")) == NULL) { printf("File open error!\n"); exit(0); } /*对文件1中的字符进行处理*/ while(!feof(fp1)){ ch = fgetc(fp1); if(ch == EOF) continue; if(ch == '/'){ ch = fgetc(fp1); //单行注释 ,遇到换行符结束,结束后需输出换行符 if(ch == '/'){ while(ch != '\n' && ch != EOF){ ch = fgetc(fp1); } fputc('\n',fp2); } /*跨行注释,遇到结束符结束,每次读入两个字符进行比较,若不是则退回一个字符,继续比较*/ else if(ch == '*'){ fgets(comment, 3, fp1); while(strstr(comment, "*/")==NULL){ fseek(fp1, -1L, SEEK_CUR); fgets(comment, 3, fp1); } } //不是注释符,只是单纯的'/'符号,则退回两个字符,读写'/' else{ fseek(fp1, -2L, SEEK_CUR); ch = fgetc(fp1); fputc(ch, fp2); } } else{ fputc(ch,fp2); } } //关闭文件 if(fclose(fp1)){ printf("Can not close the file! \n"); exit(0); } //关闭文件 if(fclose(fp2)){ printf("Can not close the file! \n"); exit(0); } printf("处理结束\n"); return 0; }