註釋轉換(從c到c++)

要完成這個問題要考慮以下因素:

1. 換行問題

/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;

2. /*與*/匹配問題

/*int i = 0;/*xxx*/ 


3. 多行註釋問題

/*
int i=0;
int j = 0;
int k = 0;
*/int n = 0;

4. 連續註釋問題

/**//**/

5. 連續**/問題

/*******/

以下爲程序代碼
1. 頭文件
#ifndef __COMMENT_CONVERT_H_
#define __COMMENT_CONVERT_H_

#include <stdio.h>
#include <stdlib.h>
enum STATE						// 設置狀態
{
	NUL_STATE,
	C_STATE,
	CPP_STATE,
	END_STATE
};

void DoConvert(FILE* pfIn, FILE* pfOut);		//選擇狀態
void DoNul_State(FILE* pfIn, FILE* pfOut);		//無狀態
void DoC_State(FILE* pfIn, FILE* pfOut);		//C狀態
void DoCpp_State(FILE* pfIn, FILE* pfOut);		//CPP狀態

#endif
2. 源文件
#include "CommentConvert.h"

enum STATE state = NUL_STATE;
void DoConvert(FILE* pfIn, FILE* pfOut)
{
	while(state != END_STATE)
	{
		switch(state)
		{
		case NUL_STATE:
			DoNul_State(pfIn,pfOut);
			break;
		case C_STATE:
			DoC_State(pfIn,pfOut);
			break;
		case CPP_STATE:
			DoCpp_State(pfIn,pfOut);
			break;
		}
	}
}

void DoNul_State(FILE* pfIn, FILE* pfOut)
{
	int first = fgetc(pfIn);
	int second = 0;
	switch(first)
	{
		case '/':
			second=fgetc(pfIn);
			switch(second)
			{
				case '/':
					fputc(first, pfOut);
					fputc(second, pfOut);
					state = CPP_STATE;
					break;
				case '*':
					fputc(first, pfOut);
					fputc('/', pfOut);
					state =C_STATE;
					break;
				default:
					fputc(first, pfOut);
					fputc(second, pfOut);
					break;
			}
			break;
		case EOF:
			state = END_STATE;
			break;
		default:
			fputc(first, pfOut);
			break;
	}
}

void Check(FILE* pfIn, FILE* pfOut)		//處理下一個字符並將指針返回當前位置
{
	int check_n = fgetc(pfIn);
	if(check_n != '\n')
	{
		fputc('\n', pfOut);
		fseek(pfIn,-1,1);
	}
	else
		fputc('\n', pfOut);	
}
void DoC_State(FILE* pfIn, FILE* pfOut)
{
	int first = fgetc(pfIn);
	int second = 0;
	int third = 0;
	switch (first)
	{
		case '\n':
			fputc('\n', pfOut);
			fputc('/', pfOut);
			fputc('/', pfOut);
			break;
		case '*':
			second = fgetc(pfIn);
			switch(second)
			{
				third = fgetc(pfIn);
				case '/':
					{
						Check(pfIn,pfOut);
						state = NUL_STATE;
					}break;
				case '*':
					fputc(first, pfOut);
					while(1)
					{
						third = fgetc(pfIn);
						if( '/' == third)
						{
							Check(pfIn,pfOut);
							state = NUL_STATE;
						}
						break;
						if( '*' == third)
							fputc(second, pfOut);
						if( ( '/'!= third ) && ( '*' != third ) )
						{
							fputc(second, pfOut);
							fputc(third, pfOut);
						}
						third = fgetc(pfIn);
					}break;
				default:
					fputc(first, pfOut);
					fputc(second, pfOut);
					break;
			}break;
		default:
			fputc(first, pfOut);
			break;
	}
}

void DoCpp_State(FILE* pfIn, FILE* pfOut)
{
	int first = fgetc(pfIn);
	switch(first)
	{
		case '\n':
			fputc(first, pfOut);
			state = NUL_STATE;
			break;
		case EOF:
			state = END_STATE;
			break;
		default :
			fputc(first, pfOut);
			break;
	}
}

3.測試文件
#include "CommentConvert.h"

void test()
{
	FILE* pfIn = fopen("input.c","r");
	FILE* pfOut = NULL;
	if( NULL == pfIn)
	{
		perror("open file for read");
		exit(EXIT_FAILURE);
	}
	pfOut = fopen("output.c","a");
	if( NULL == pfOut)
	{
		perror("open file for w");
		fclose(pfIn);
		exit(EXIT_FAILURE);
	}

	DoConvert(pfIn,pfOut);

	fclose(pfIn);
	fclose(pfOut);
}

int main()
{
	test();
	return 0;
}



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