天天看点

小项目_注释转换_c

 我们用3部分来实现。   

逻辑和条理清晰。

.h  部分 

#ifndef __test_h__              //定义
#define __test_h__

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


#define INPUT "input.c"          
#define OUTPUT "output.c"

enum KIND //枚举表示操作选项
{
	END_START,
	NULL_START,
	C_START,
	CPP_START,
};

void note_convert(FILE *pfin,FILE *pfout);//注释转化操作函数
void null_state(FILE *pfin,FILE *pfout,enum KIND *sta);//普通字符转换函数
void c_state(FILE *pfin,FILE *pfout,enum KIND *sta);//c语言注释转换为c++注释函数
void cpp_state(FILE *pfin,FILE *pfout,enum KIND *sta);//c++注释转化函数

#endif
           

主函数部分

#include "test.h"

int main()
{
	FILE *pfout = NULL;         //定义文件指针 输出
	FILE *pfin = NULL;
	pfin = fopen(INPUT,"r");//打开文件(命令)
	if(pfin == NULL)
	{
		perror("not open file");  //提示错位原因
		exit(EXIT_FAILURE);        //失败的宏定义显示
	}
	pfout = fopen(OUTPUT,"w");    //写入文件
	if(pfout == NULL)
	{
		perror("not open file ");
		fclose(pfin);
		exit(EXIT_FAILURE);
	}
	note_convert(pfin,pfout);     //调用注释转换函数
	system("pause");
	return 0;
}

           

函数功能部分

#include "test.h"

void note_convert(FILE *pfin,FILE *pfout)//注释转化操作函数
{
	int input = 0;
	int output = 0;
	enum KIND sta =  NULL_START;
	while (sta != END_START)
	{
		switch (sta)
		{
		case NULL_START:
			null_state(pfin,pfout,&sta);
			break;
		case C_START:
			c_state(pfin,pfout,&sta);
			break;
		case CPP_START:
			cpp_state(pfin,pfout,&sta);
			break;
		case END_START:
			break;
		default:
			break;
		}
	}
	printf("converted! ");
	fclose(pfin);
	fclose(pfout);
}
void null_state(FILE *pfin,FILE *pfout,enum KIND *sta)//普通字符转换函数
{
	int _f = 0;
	int _s = 0;
	_f = fgetc(pfin);//从intput.c文件中读取一个字符
	switch(_f)
	{
	case '/':
		{
			fputc(_f ,pfout);//将第一个字符输出到output.c文件中
			_s = fgetc(pfin);//读取下一个字符
			switch(_s)
			{
			case '*':  //如果是 ‘/*’   就将‘ *’ 改为 ‘/’ 放入 output.c中
				fputc('/',pfout);
				*sta = C_START; // 进入C语言注释转换函数中
				break;
			case '/':  //如果是// 将_s 输出到output.c 文件中
				fputc(_s,pfout);
				*sta = CPP_START; // 进入cpp注释转换函数中
				break;
			default :
				fputc(_s,pfout);
				break;
			}
		}
	case EOF:  //读取到了文件末尾
		fputc(_f,pfout);
		*sta = END_START;
		break;
	default:  //其他字符
		fputc(_f,pfout);
		break;
	}
}
void c_state(FILE *pfin,FILE *pfout,enum KIND *sta)//c语言注释转换为c++注释函数
{
	int _f = 0;
	int _s = 0;
	int _t = 0;
	_f = fgetc(pfin);
	switch(_f)
	{
	case '/':
		fputc(_f,pfout);
		break;
	case '*':
		_s = fgetc(pfin);
		switch(_s)
		{
		case '*':
			fputc(_f,pfout);
			ungetc(_s,pfin);// 将之后的内容放到缓存区
			break;
		case '/':
			{
				_t = fgetc(pfin);//判断第三个字符是不是“\n”解决这种注释问题 /*int i=0*/int i=0;
				*sta = NULL_START;
				if(_t =='\n')
				{
					fputc('\n',pfout);
				}
				else
				{
					fputc('\n',pfout);
					ungetc(_t,pfin);
				}
				break;
			}	
		default:
			fputc(_f,pfout);
			fputc(_s,pfout);
			break;
		}
		break;
	case '\n':
	 	{
			_s = fgetc(pfin);
			switch(_s)
			{
			case '*':
				{
					_t = fgetc(pfin);
					if(_t == '/')
					{

						fputc('\n',pfout);
						*sta = NULL_START;
					}
					else
					{
						fputc('/',pfout);
						fputc('/',pfout);
						fputc(_s,pfout);
						fputc(_t,pfout);
					}
					break;
				}
			default:
				fputc('\n',pfout);
				fputc('/',pfout);
				fputc('/',pfout);
				ungetc(_s,pfin);
				break;
			}
			break;
		}
	default:
		fputc(_f,pfout);
		break;
		}
}

void cpp_state(FILE *pfin,FILE *pfout,enum KIND *sta)//c++注释转化函数
{
	int _f = 0;
	_f = fgetc(pfin);
	switch(_f)
	{
	case '\n':
		{
			fputc(_f , pfout);
			*sta = NULL_START;
			break;
		}
	default:
		{
			fputc(_f,pfout);
			break;
		}
	}
}

           

继续阅读