将c文件注释进行转化的练习小项目

本文介绍了一个使用C语言实现的简单程序,该程序能够将C语言风格的注释转换为C++风格的注释。通过状态机的方式,程序可以处理不同类型的注释并将其转换成目标格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目描述:

利用c语言文件IO来实现c,c++源代码中注释内容的转换:c注释转换为C++风格注释。

练习目的:

c语言,函数,预处理,文件IO,状态机编程

定位:

巩固语法基础。适合初学。


先看头文件

#pragma once

enum//枚举
{
	NULLSET,
	CSET,
	CPPSET,
	EOFSET
};

#include<stdlib.h>
#define INPUT "input.txt"//文件名
#define OUTPUT "output.txt"

void converter_mian();
void converter_null(FILE *ipf,FILE *opf);
void converter_cpp(FILE *ipf,FILE *opf);
void converter_c(FILE *ipf,FILE *opf);

函数功能:

#include<stdio.h>
#include"converter.h"


static int status = NULLSET;


void converter_null(FILE *ipf,FILE *opf)//普通文字
{
	int c = fgetc(ipf);
	switch(c)
	{
	case '/':            //遇到/时候对其进行判断
		{
			int n = fgetc(ipf);
			switch(n)
			{
			case '/':     //这时对其进行cpp模式
				{
					fputc('/',opf);
					fputc('/',opf);
					status = CPPSET;
				}
				break;
			case '*':     //进行c模式
				{
					fputc('/',opf);
					fputc('/',opf);
					status = CSET;
				}
				break; 
			case EOF:
				status = EOFSET;
				break;
			default:
				fputc('/',opf);
				fputc(c,opf);
				break;
			}
		}
		break;
	case EOF:          // 文件结尾
		status = EOFSET;
		break;
	default :
		fputc(c,opf);  //对普通字符进行读取  
		break;
	}
}



void converter_c(FILE *ipf,FILE *opf)//c语言注释
{
	int c = fgetc(ipf);
	switch(c)
	{
	case '*':                    //遇到*时进行c注释结尾判断
		{
			int n = fgetc(ipf);
			switch(n)
			{
			case '/':    //注释结尾
				{
					fputc('\n',opf);   //进行换行
					status = NULLSET;
				}
				break;
			default:
				ungetc(n,ipf);    // 排除  /****/这种情况
				status = NULLSET;
				break;
			}
		}
		break;
	case '\n':      //进行多行注释
		fputc('\n',opf);
		fputc('/',opf);
		fputc('/',opf);
		break;
	case EOF:      //文件结尾
		status = EOFSET;
		break;
	default :
		fputc(c,opf);
		break;
	}
}




void converter_cpp(FILE *ipf,FILE *opf)//cpp注释
{
	int c = fgetc(ipf);
	switch(c)
	{
	case'\n':     //注释完一行进行换行
		fputc('\n',opf);
		status = NULLSET;
		break;
	case EOF:     //文件结尾
		status = EOFSET;
		break;
	default :     //读取下一个字符
		fputc(c,opf);
		break;
	}
}

void converter_mian()//函数体
{
	
	FILE *ipf = fopen(INPUT,"r");
	FILE *opf = fopen(OUTPUT,"w");
	if (ipf == NULL || opf == NULL)   //判断文件是否被正常打开
	{
		fprintf(stderr,"open defeat\n");
		exit(1);
	}
	while(status != EOFSET)  
	{
		switch(status)   //判断模式
		{
		case NULLSET:
			{
				converter_null(ipf,opf);
			}
			break;
		case CSET:
			{
				converter_c(ipf,opf);
			}
			break;
		case CPPSET:
			{
				converter_cpp(ipf,opf);
			}
			break;
		case EOFSET:
			break;
		default :
			break;
		}
	}
		
	fclose(ipf);   
	fclose(opf);
}

主函数测试

#include<stdio.h>
#include"converter.h"



int main()
{
	converter_mian();
	return 0;	
}

测试必须有测试用例,我们就来用input.txt文件和output.txt文件来进行测试。


来看看测试结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值