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

 

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