【C語言】註釋轉換

分析思路:狀態轉換

將註釋分爲 常規狀態(null),C語言狀態(/*), Cpp狀態(//)

用三種狀態的轉換來分析複雜多樣的註釋情況;




Commentconvert.h

#ifndef __COMMENTCONVERT_H__
#define __COMMENTCONVERT_H__

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef enum STATE
{
	NULL_STATE,
	C_STATE,
	CPP_STATE,
	END_STATE,
}STATE;

void DoConverWork(FILE *pfin, FILE *pfout);           //轉換工作函數
void DoNULLState(FILE *pfin, FILE *pfout, STATE *ps); //空狀態處理
void DoCState(FILE *pfin, FILE *pfout, STATE *ps);    //C狀態處理
void DoCPPState(FILE *pfin, FILE *pfout, STATE *ps);  //Cpp狀態處理



#endif //__COMMENTCONVERT_H__


Commentcovert.c

#include "CommentConvert.h"
void DoConverWork(FILE *pfin, FILE *pfout)//轉換工作函數
{
	STATE state = NULL_STATE;
	while (state != END_STATE)
	{
		switch (state)
		{
		case NULL_STATE:
			DoNULLState(pfin, pfout, &state);
			break;
		case C_STATE:
			DoCState(pfin, pfout, &state);
			break;
		case CPP_STATE:
			DoCPPState(pfin, pfout, &state);
			break;
		}
	}
}
void DoNULLState(FILE *pfin, FILE *pfout, STATE *ps)
{
	int first = 0;
	first = fgetc(pfin);
	switch (first)
	{
	case '/':
	{
		int second = 0;
		second = fgetc(pfin);
		switch (second)
		{
		case '*'://c狀態
		{
			fputc('/', pfout);
			fputc('/', pfout);
			*ps = C_STATE; //指向C處理
		}
		break;
		case '/'://cpp狀態
		{
			fputc(first, pfout);
			fputc(second, pfout);
			*ps = CPP_STATE;//指向cpp處理
		}
		break;
		default:
			break;
		}
	}
	break;
	case EOF:
		*ps = END_STATE;
		break;
	default:
		fputc(first, pfout);
		break;
	}
}
void DoCState(FILE *pfin, FILE *pfout, STATE *ps) //c狀態
{
	int first = 0;
	first = fgetc(pfin);
	switch (first)
	{
	case '*':
	{
		int second = fgetc(pfin);
		switch (second)
		{
		case '/':
			fputc('\n', pfout);
			*ps = NULL_STATE;
			break;
		default:
			fputc(first, pfout);
			ungetc(second, pfin);//返回*之後的字符 以防出現**/
		}
	}
	break;
	case '\n':
	{
		fputc('\n', pfout);
		fputc('/', pfout);
		fputc('/', pfout);
	}
	break;
	default:
		fputc(first, pfout);
		break;
	}
}
void DoCPPState(FILE *pfin, FILE *pfout, STATE *ps)//cpp狀態
{
	int first = 0;
	first = fgetc(pfin);
	switch (first)
	{
	case '\n':
		fputc('\n', pfout);
		*ps = NULL_STATE;
		break;
	case EOF:
		*ps = END_STATE;
		break;
	default:
		fputc(first, pfout);
	}
}

test.c


#include "CommentConvert.h"
#define IN_FILENAME "input.c"
#define OUT_FILENAME "output.c"

int main()
{
	FILE * pfwrite = NULL;
	FILE * pfread = NULL;
    pfread = fopen(IN_FILENAME, "r");
	if (pfread == NULL)
	{
		perror("open file for read");
		exit(EXIT_FAILURE);
	}
	pfwrite = fopen(OUT_FILENAME, "w");
	if (pfwrite == NULL)
	{
		perror("open file for write");
		exit(EXIT_FAILURE);
	}
	DoConverWork(pfread, pfwrite);
	fclose(pfread);
	fclose(pfwrite);
	return 0;
}



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