C注释转换到C++注释项目

来源:互联网 发布:52pk软件下载 编辑:程序博客网 时间:2024/05/20 16:00

.h文件

#ifndef__COMMENT_CONVERT_H__
#define__COMMENT_CONVRET_H__

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

#defineINPUTFILENAME "input.c"
#defineOUTPUTFILENAME"output.c"

typedefenumCONVERT_STATE
{
                NULL_STATE,
                C_STATE,
                CPP_STATE,
                END_STATE
}StateType;


voidCommentConvert();
voidConvertWork(FILE*read,FILE*write);
voidDoNullState(FILE*read,FILE*write);
voidDoCState(FILE*read,FILE*write);
voidDoCppState(FILE*read,FILE*write);

#endif



.c文件
#define_CRT_SECURE_NO_WARNINGS1

#include"CommentConvert.h"

StateTypestate;

voidDoCppState(FILE*read,FILE*write)
{
                intfirst = fgetc(read), second = 0;
                switch(first)
                {
                case'\n':
                                                fputc(first,write);
                                                state = NULL_STATE;
                                                break;

                caseEOF:
                                //fputc(first, write);
                                state = END_STATE;
                                break;
                default:
                                fputc(first,write);
                                break;
                }
}

voidDoCState(FILE*read,FILE*write)
{
                intfirst = fgetc(read), second = 0,third=0;
                switch(first)
                {
                case'*':
                                second = fgetc(read);
                                if(second =='/')
                                {
                                                third = fgetc(read);
                                                if(third =='\n')
                                                                fputc(third,write);
                                                else
                                                {
                                                                ungetc(third,read);
                                                    fputc('\n',write);
                                    }
                                                state = NULL_STATE;
                                }
                                elseif(second =='*')
                                {
                                                ungetc(second,read);
                                                fputc(first,write);
                                }
                                else
                                {
                                                fputc(first,write);
                                                fputc(second,write);
                                }
                                break;

                case'\n':
                                                fputc(first,write);
                                                fputc('/',write);
                                                fputc('/',write);
                                                break;

                caseEOF:
                                //fputc(first, write);
                                state = END_STATE;
                                break;

                default:
                                fputc(first,write);
                                break;
                }
}


voidDoNullState(FILE*read,FILE*write)
{
                intfirst = fgetc(read), second = 0;

                switch(first)
                {
                case'/':
                                second = fgetc(read);
                                if(second =='/')
                                {
                                                state = CPP_STATE;
                                                fputc(first,write);
                                                fputc(second,write);
                                                //

                                }
                                elseif(second =='*')
                                {
                                                fputc(first,write);
                                                fputc('/',write);
                                                state = C_STATE;
                                }
                                else
                                {
                                                fputc(first,write);
                                                fputc(second,write);
                                }
                                break;
                caseEOF:
                                fputc(first,write);
                                state = END_STATE;
                                break;
                default:
                                fputc(first,write);
                                break;
                }
}


voidConvertWork(FILE*read,FILE*write)
{
                state = NULL_STATE;

                while(state != END_STATE)
                {
                                switch(state)
                                {
                                caseNULL_STATE:
                                                DoNullState(read,write);
                                                break;
                                caseC_STATE:
                                                DoCState(read,write);
                                                break;
                                caseCPP_STATE:
                                                DoCppState(read,write);
                                                break;
                                }
                }
}


voidCommentConvert()
{
                FILE*pRead, *pWrite;

                pRead = fopen(INPUTFILENAME,"r");
                if(pRead ==NULL)
                {
                                perror("INPUTFILENAME");
                                system("pause");
                                exit(EXIT_FAILURE);
                }

                pWrite = fopen(OUTPUTFILENAME,"w");
                if(pWrite ==NULL)
                {
                                perror(OUTPUTFILENAME);
                                fclose(pRead);
                                system("pause");
                                exit(EXIT_FAILURE);
                }

                ConvertWork(pRead, pWrite);
                fclose(pRead);
                fclose(pWrite);
}


测试部分
#define_CRT_SECURE_NO_WARNINGS1

#include"CommentConvert.h"

voidTest()
{
                CommentConvert();
}


intmain()
{

                Test();

                system("pause");
                return0;
}


input.c

wKiom1butHqx-vzkAAAgGFw9bjQ226.png

output.c

wKioL1butRLTofNoAAAdltDJB0s227.png

利用状态机把此问题中涉及的分为3个状态,即C状态,C++状态,NULL状态,当遍历到某一个\n,/*,//时,要分情况这三个状态之间转换

0 0