消去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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章