消去C、C++程序中的注释
作者:互联网
一、实验目的及要求
(1)掌握C语言文件的基本操作,消除源C语言程序中的注释,为以后的编译提供方便。
二、实验设备(环境)及要求
PC机及vc6.0软件及环境
三、实验内容与步骤
(1)先输入输出文件名和输入文件名,对输入文件和输出文件分别判断其的可读性和可写性,如果输入文件不可读或输出文件不可写,则报错;如果输入输出正常,则从程序中开始读取字符进行相应的操作。
(2)首先第一个判断是判断读取的字符是否为”,如果是,再判断是否历经在‘’里面了(c是否等于0),如果不在那里面,则做标记,让在””里面的字符都正常写入输出文件。
(3)接着第一个判断是判断读取的字符是否为‘,如果是,再判断是否历经在““里面了(p是否等于0),如果不在那里面,则做标记,让在’‘里面的字符都正常写入输出文件。
(4)判断是否出现单独的*/,如果出现,则输出error:*/error character,
判断方法:当不在““或‘’里面(即count=0)并且不再注释里面(即temp=0)时,判断当前字符是否为‘*’,如果是,则判断下一个是否为‘/‘,如果是则输出error:*/error character,如果不是,则做一个标记(t=1),让本次循环输出当前字符和前一个字符。
(5)然后进行注释的消除:当当前字符为‘/’并且不在““或‘’中时,判断下一个字符是否为‘/’或‘*’,如果是‘/’,则做一个标记(flag=1),让注释不写入输出文件中,直到字符为‘\n’时才恢复输入(flag=0),如果是‘*’,则做标记(temp=1和flag=1),让注释不写入输出文件,直到字符为‘*/’时才恢复输入(flag=0 和 temp=0);
(6)每循环一次,往后读一个字符,知道字符读完;
(7)循环结束后判断,是否还在/*的注释中(temp是否为1),如果temp=1,则说明/*的注释没有结尾的*/。输出错误,打印出“error:/*error “;
(8)最后,关闭输入和输出文件。
四、实验结果与数据处理
所有功能一次性测试。
输入文件:input.cpp
控制台错误提醒:。
输出文件:
五、代码清单
#include"stdio.h"
#include"stdlib.h"
main()
{
FILE *fp1,*fp2;
char ch1,ch3,ifile[100],ofile[100];
int t,temp,count,flag,c,p;
printf("请输入输入文件名:");
scanf("%s",ifile);
printf("请输入输出文件名:");
scanf("%s",ofile);
if((fp1=fopen(ifile,"r"))==NULL) // input.cpp为任意带注释的C程序
{
printf("file cannot be opened\n");
exit(1);
}
if((fp2=fopen(ofile,"w"))==NULL) // ouput.cpp为去掉注释后的程序
{
printf("file cannot be writed\n");
exit(1);
}
ch1=fgetc(fp1);
flag = 0;
count = 0;
temp = 0;
c=0;
p=0;
while(!feof(fp1))
{
t=0;
ch3 = ch1;
if(ch3 == '"' && c == 0) //判断是否在""中,如果在,不需要去除
{
count ++;
p = 1;
if(count == 2)
{
p =0;
count = 0;
}
}
if(ch3 == '\'' && p == 0)
{
count ++;
c = 1;
if(count == 2)
{
c =0;
count = 0;
}
}
if(count == 0 && temp == 0 && ch3 == '*') //判断是否出现单独*/错误
{
ch1 = fgetc(fp1);
if(ch1 == '/')
{
printf("error:*/error character\n");
}
else
{
t=1;
}
}
if(ch3 == '/' && count ==0) //消除注释
{
ch1 = fgetc(fp1);
if(ch1 == '/')
{
flag=1;
}
else if(ch1='*')
{
temp = 1;
flag = 1;
}
}
if(ch1 == '\n' && temp != 1)
{
flag=0;
}
if(flag == 0)
{
fputc(ch1,fp2);
}
if(t == 1)
{
fputc(ch3,fp2);
fputc(ch1,fp2);
}
if(temp == 1)
{
ch3 = ch1;
if(ch3 == '*')
{
ch1 = fgetc(fp1);
if(ch1 == '/')
{
temp = 0;
flag = 0;
}
}
}
ch1 = fgetc(fp1);
}
if(temp == 1 ) //判断是否有出现/*,而没有*/来结束的错误
{
printf("error:/*error\n");
}
fclose(fp1);
fclose(fp2);
return 0;
}
Riker-k 发布了32 篇原创文章 · 获赞 8 · 访问量 1万+ 私信 关注
标签:count,消去,temp,字符,C++,注释,ch1,flag,error 来源: https://blog.csdn.net/weixin_40789841/article/details/104068053