注释转换程序

这个程序的目的是:把C注释全部转换为C++注释

程序有以下几个状态:

1、无状态:代码的正文部分

2、C状态:注释方式为C注释

3、C++状态:注释方式为C++注释

4、END:结束状态

这几种状态的关系

注释转换程序_第1张图片

首先我们要打开input.c文件,对这个文件内部的文件进行读取,然后处理,否则直接提示用户有错误。 接下来,我们还要打开output.c文件,对处理以后的代码进行写入。

注释转换程序_第2张图片

转换机制:先创建一个状态机,在读取到文件时将初始状态先设为NULL_STATE,然后通过fputc函数

从文件中按一个字符一个字符的方式来读取,当读到'/*'时,说明接下来读到的是C_STATE状态,然后将状态机的

状态改为C_STATE状态,进入C状态后,接下来就是要判断是否读到'*/',如果读到就将状态机设置为 

NULL_STATE状态。当然在进去C状态后还要考虑其他很多情况,具体在代码中来看。当读到'//'时,则进入

CPP_STATE状态,这时将状态机设置为CPP_STATE状态,CPP注释是按照行来注释的,所以判断CPP状态结束

的标志自然就是'\n'了。


input.c

// 1.一般情况
int num = 0;
// int i = 0; 
 
// 2.换行问题
// int i = 0; 
int j = 0;
// int i = 0; 
int j = 0;
 
// 3.匹配问题
//int i = 0;/*xxxx
 
// 4.多行注释问题
//
//int i=0;
//int j = 0;
//int k = 0;
//
int k = 0;
 
// 5.连续注释问题
//
//
 
// 6.连续的**/问题
//*
 
// 7.C++注释问题
// /*xxxxxxxxxxxx*/

注释转换程序

代码实现

CommentConver.h

#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#define  _CRT_SECURE_NO_WARNINGS 0
#include
#include 

enum State
{
	NUL_STATE,//无注释状态
	C_STATE,//C注释状态
	CPP_STATE,//C++注释状态
	END_STATE//结束状态
};
void DoNulState(FILE* pfIn, FILE* pfOut, enum State* ps);
void DoCState(FILE* pfIn, FILE* pfOut, enum State* ps);
void DoCppState(FILE* pfIn, FILE* pfOut, enum State* ps);

void CommentConvert(FILE* pfIn, FILE* pfOut);

#endif //__COMMENT_CONVERT_H__

CommentConver.c

#include "CommentConvert.h"



void DoNulState(FILE* pfIn, FILE* pfOut, enum State* ps)
{
	int first = fgetc(pfIn);
	switch (first)
	{
	case '/':
		{
				int second = fgetc(pfIn);
				switch (second)
				{
				case '*':
					{
							fputc('/', pfOut);
							fputc('/', pfOut);
							*ps = C_STATE;
					}
					break;
				case '/':
					{
							fputc(first, pfOut);
							fputc(second, pfOut);
							*ps = CPP_STATE;
					}
					break;
				default:
					{
						    fputc(first, pfOut);
						    fputc(second, pfOut);
								
					}
					break;
				}
		}
		break;
	case EOF:
		fputc(first, pfOut);
		*ps = END_STATE;
		break;
	default:
		fputc(first, pfOut);
		break;
	}
}
void DoCState(FILE* pfIn, FILE* pfOut, enum State* ps)
{
	int first = fgetc(pfIn);
	switch (first)
	{
	case '*':
		{
				int second = fgetc(pfIn);
				switch (second)
				{
				case '/':
					{
							int third = fgetc(pfIn);
							if (third == '\n')
							{
								fputc(third, pfOut);
							}
							else
							{
								fputc('\n', pfOut);
								ungetc(third, pfIn);
							}
							*ps = NUL_STATE;
					}
					break;
				case '*':
					break;
				default:
					fputc(first, pfOut);
					fputc(second, pfOut);

					break;  
				}
		}
		break;
	default:
		fputc(first, pfOut);
		break;
	}
}
void DoCppState(FILE* pfIn, FILE* pfOut, enum State* ps)
{
	int first = fgetc(pfIn);
	switch (first)
	{
	case '\n':
		{
				 fputc(first, pfOut);
				 *ps = NUL_STATE;
		}
		break;
	case EOF:
		fputc(first, pfOut);
		*ps = END_STATE;
		break;
	default:
		fputc(first, pfOut);
		break;
	}
}
void CommentConvert(FILE* pfIn, FILE* pfOut)
{
	enum State state = NUL_STATE;
	while (state != END_STATE)
	{
		switch (state)
		{
		case NUL_STATE:
			DoNulState(pfIn,pfOut,&state);
			break;
		case C_STATE:
			DoCState(pfIn, pfOut, &state);
			break;
		case CPP_STATE:
			DoCppState(pfIn, pfOut, &state);
			break;
		}
	}
}

test.c

#include"CommentConvert.h"

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

	fclose(pfIn);
	pfIn = NULL;
	fclose(pfOut);
	pfOut = NULL;
}

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

你可能感兴趣的:(C语言项目)