C语言编写注释风格转换

首先先来看看转换之前的文件注释:


C语言编写注释风格转换_第1张图片

经过分析,我们发现这些注释无非就是在下面四种情况之间进行转换,所以可以很容易编写出代码

C语言编写注释风格转换_第2张图片

接下来编写我们的代码

1.Commentconvert.h

#define _CRT_SECURE_NO_WARNINGS 1

#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__

#include 
#include 

enum STATE
{
	NUL_STATE,//正常状态
	C_STATE,  //C注释状态
	CPP_STATE,//C++注释状态
	END_STATE //文件结束
};

void DoCState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoCppState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoNulState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoConvetWork(FILE *pfIn, FILE *pfOut);

#endif //__COMMENT_CONVERT_H__

2.Commentconvert.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "CommentConvert.h"


void DoConvetWork(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;
		default:
			break;
		}
	}
}
void DoNulState(FILE *pfIn, FILE *pfOut, enum STATE *s)
{
	int first = 0;
	int second = 0;
	first = fgetc(pfIn);
	switch (first)
	{
	case '/':
	{
				second = fgetc(pfIn);
				if (second == '*')
				{
					fputc('/', pfOut);
					fputc('/', pfOut);
					*s = C_STATE;
				}
				else if (second == '/')
				{
					fputc(first, pfOut);
					fputc(second, pfOut);
					*s = CPP_STATE;
				}
				else
				{
					fputc(first, pfOut);
					fputc(second, pfOut);
				}
	}
		break;
	case EOF:
	{
				*s = END_STATE;
	}
		break;
	default:
		fputc(first, pfOut);
		break;
	}
}

void DoCState(FILE *pfIn, FILE *pfOut, enum STATE *s)
{
	int first = 0;
	int second = 0;
	int third = 0;
	first = fgetc(pfIn);
	switch (first)
	{
	case '\n':
	{
				 fputc(first, pfOut);
				 fputc('/', pfOut);
				 fputc('/', pfOut);
	}
		break;
	case '*':
	{
				second = fgetc(pfIn);
				switch (second)
				{
				case '/':
				{
							*s = NUL_STATE;
							third = fgetc(pfIn);
							if (third == '\n')
							{
								fputc(third, pfOut);
							}
							else if (third == '/')
							{
								ungetc(third, pfIn);
								fputc('\n', pfOut);
							}
							else
							{
								fputc('\n', pfOut);
								fputc(third, pfOut);
							}
				}
					break;
				case '*':
				{
							fputc(second, pfOut);
							ungetc('*', pfIn);
				}
					break;
				default:
					fputc(first, pfOut);
					fputc(second, pfOut);
					break;
				}

	}
		break;
	case EOF:
		*s = END_STATE;
		break;
	default:
		fputc(first, pfOut);
		break;
	}
}
void DoCppState(FILE *pfIn, FILE *pfOut, enum STATE *s)
{
	int first = 0;
	first = fgetc(pfIn);
	switch (first)
	{
	case '\n':
	{
				 fputc(first, pfOut);
				 *s = NUL_STATE;
	}
		break;
	case EOF:
		*s = END_STATE;
		break;
	default:
		fputc(first, pfOut);
		break;
	}
}

3.test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "CommentConvert.h"

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

int main()
{
	test();
	system("pause");
	return 0;
}


接下来执行程序之后我们再来看看转换之后的文件注释:

C语言编写注释风格转换_第3张图片

这样我们的注释转换就完成了

你可能感兴趣的:(C语言编写注释风格转换)