删除C文件中的注释
今天是C语言课后的一道题目,感觉比较有趣,刚开始一直没有相通,花了很长时间,后来想到了一种解决办法,在这里分享一下,有其他办法的也可在评论区留言大家交流。
题目描述
删除文件中的注释:将C语言源程序(hello.c)文件中的所有注释去掉后存入另一个文件(new_hello.c)
问题分析
注释有两种,多行注释(“/* /”)和单行注释(“// ”)。
解决思路如下:
逐个对文件一中的字符进行分析,遇到字符’/‘进入下一步分析,否则直接将该字符存入文件二中。
当前一个字符为’/’,第二个字符可分为三种情况,
①第二个字符为’/’,则此时注释符为单行注释,此时文件一中该行剩余的字符都将不再输入文件二,直到遇到换行符结束循环。
②第二个字符为’’,则此时注释符为多行注释,这种情况下,需要找到“/”,直到“/”之前的字符都将不再输出到文件二。这种情况下我想了很长时间如何实现,我的解决办法是,读到’'后将使用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;
}