C语言编写注释风格转换

本文介绍了如何对C语言源代码中的注释进行风格转换。通过分析注释的四种常见情况,作者展示了如何编写代码实现这一转换过程,包括Commentconvert.h、Commentconvert.c和test.c三个关键文件的创建,从而完成注释风格的转换任务。
摘要由CSDN通过智能技术生成

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


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

接下来编写我们的代码

1.Commentconvert.h

#define _CRT_SECURE_NO_WARNINGS 1

#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__

#include <stdio.h>
#include <stdlib.h>

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


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


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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值