注释转换

来源:互联网 发布:淘宝联盟怎么一起结算 编辑:程序博客网 时间:2024/06/06 06:40

注释转换:本文将C语言注释转换为C++注释;
C语言注释风格:一次可以注释多行
/* …………………………….. */

C++注释风格:一次只能注释一行
//………………………..

C注释到C++转换转换关系如图所示:
这里写图片描述

注意:C状态不会直接到EOF
目的:将下列代码转换为C++风格

// 1.一般情况int num = 0;/* int i = 0; */// 2.换行问题/* int i = 0; */int j = 0;/* int i = 0; */int j = 0;// 3.匹配问题/*int i = 0;/*xxxxx*/// 4.多行注释问题/*int i=0;int j = 0;int k = 0;*/int k = 0;// 5.连续注释问题/**//**/// 6.连续的**/问题/***/// 7.C++注释问题// /*xxxxxxxxxxxx*/
//头文件Commentcovert.h#define _CRT_SECURE_NO_WARNINGS 1#ifndef __CommentCovert_H__#define __CommentCovert_H__#include<stdio.h>#include<stdlib.h>typedef enum STATE  //定义一个枚举类型{    NULL_state, //空状态    C_state,    //C状态    CPP_state,  //C++状态    END_state   //结束状态}STATE;void DoNullState(FILE *pFIn, FILE *pFOut);  //处理空状态void DoCState(FILE *pFIn, FILE *pFOut);     //处理C状态void DoCppState(FILE *pFIn, FILE *pFOut);    //处理C++状态void DoCovertWork(FILE *pFIn, FILE *pFOut);  //执行转换函数#endif
//实现函数Commentcovert.c#define _CRT_SECURE_NO_WARNINGS 1#include"Commentcovert.h"char first = 0;char second = 0;char third = 0;STATE state = NULL_state;   //定义开始状态为空void DoCovertWork(FILE *pFIn, FILE *pFOut){    state = NULL_state;    while (state != END_state)    {        switch (state)        {        case NULL_state:            DoNullState(pFIn,pFOut);            break;        case C_state:            DoCState(pFIn, pFOut);            break;        case CPP_state:            DoCppState(pFIn,pFOut);            break;        default:            break;        }    }}void DoNullState(FILE *pFIn, FILE *pFOut){    first = fgetc(pFIn);    switch (first)    {    case '/':    {                second = fgetc(pFIn);                switch (second)                {                case '*':       //进入C状态                    fputc(first, pFOut);                    fputc('/', pFOut);                    state = C_state;                    break;                case '/':  //进入C++状态                    fputc(first, pFOut);                    fputc(second, pFOut);                    state = CPP_state;                    break;                default:                    fputc(first, pFOut);                    fputc(second, pFOut);                    break;                }    }        break;    case EOF:        state = END_state;        break;    default:        fputc(first, pFOut);        break;    }}void DoCppState(FILE *pFIn, FILE *pFOut){    first = fgetc(pFIn);    switch (first)    {    case '\n':       //C++状态遇到\n转换为空状态        fputc(first, pFOut);        state = NULL_state;        break;    case EOF:        state = END_state;        break;    default:        fputc(first, pFOut);        break;    }}void DoCState(FILE *pFIn, FILE *pFOut){    first = fgetc(pFIn);    switch (first)    {    case '*':    {                second = fgetc(pFIn);                switch (second)                {                case '/':   //C状态遇到*/转换为空状态                {                            third = fgetc(pFIn);                            if (third != '\n')                            {                                fputc('\n', pFOut);                            }                            if (third == '/')                            {                                ungetc(third, pFIn);   //  遇到连续注释/**//**/这种问题                                state = NULL_state;   //  需要将 /重新写到input中                                break;                            }                            fputc(third, pFOut);                            state = NULL_state;                }                    break;                case '*':                {                            fputc(first, pFOut);  //遇到连续的/***/问题                            third = fgetc(pFIn);  //  需要将 *重新写到output中                            if ('/' == third)                                state = NULL_state;                }                    break;                default:                    fputc(first, pFOut);                    fputc(second, pFOut);                    break;                }    }        break;    case '\n':        fputc(first, pFOut);        fputc('/', pFOut);        fputc('/', pFOut);        break;    case EOF:        state = END_state;        break;      default:        fputc(first, pFOut);        break;    }}
//测试文件test.c#define _CRT_SECURE_NO_WARNINGS 1#include"Commentcovert.h";int main(){    FILE *pFIn = NULL;    FILE *pFOut = NULL;    pFIn = fopen("input.txt", "r");//打开 读取 的文件    if (pFIn == NULL)    {        perror("读取文件失败!!!");        exit(EXIT_FAILURE);    }    pFOut = fopen("output.txt", "w");  //打开 要写入 的文件    if (pFOut == NULL)    {        perror("写入文件失败!!!");        fclose(pFIn);       //写入文件失败记得关闭打开文件        exit(EXIT_FAILURE);    }    DoCovertWork(pFIn,pFOut); //执行转换函数    fclose(pFIn);    fclose(pFOut);    system("pause");    return 0;}

程序执行后output:

// 1.一般情况int num = 0;// int i = 0; // 2.换行问题// int i = 0; int j = 0;// int i = 0; int j = 0;// 3.匹配问题//int i = 0;/*xxxxx// 4.多行注释问题////int i=0;//int j = 0;//int k = 0;//int k = 0;// 5.连续注释问题////// 6.连续的**/问题//*// 7.C++注释问题// /*xxxxxxxxxxxx*/
0 0
原创粉丝点击