注释转换

来源:互联网 发布:面码仁太 知乎 编辑:程序博客网 时间:2024/06/05 04:22

c和c++中的注释有几下几种情况:

// 1.一般情况/* 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*/

我们的任务是将c的注释转换为c++的注释,c++的注释转换为c的注释。下面来看程序,为了使程序更加有条理性,我自定义了头文件,将测试函数与头文件分开。
头文件部分:

#ifndef __COMMENTCONVERT_H__#define __COMMENTCONVERT_H__#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#define INPUT  "input.c"#define OUTPUT  "output.c"enum state//存放4种状态{    NULL_State,    C_State,    CPP_State,    END_State};void CommentConvert(FILE *pfin, FILE *pfout);void Do_NULL_State(FILE *pfin, FILE *pfout, enum state *sta);void Do_C_State(FILE *pfin, FILE *pfout, enum state *sta);void Do_CPP_State(FILE *pfin, FILE *pfout, enum state *sta);#endif

函数实现部分:

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#include "CommentConvert.h"void Do_NULL_State(FILE *pfin, FILE *pfout, enum state *sta){    int first = 0;    int second = 0;    first = fgetc(pfin);//从文件中读取第一个字符    switch (first)    {    case'/':    {               second = fgetc(pfin); //从文件中读取第二个字符               switch (second)               {               case'*':                   fputc('/', pfout);                   fputc('/', pfout);                   *sta = C_State;//转c注释                   break;               case'/':                   fputc('/', pfout);                   fputc('*', pfout);                   *sta = CPP_State;//转c++注释                   break;               default:                   fputc(first, pfout);                   fputc(second, pfout);                   break;               }    }        break;    case EOF:        fputc(first, pfout);        *sta = END_State;        break;    default:        fputc(first, pfout);        break;    }}void Do_C_State(FILE *pfin, FILE *pfout, enum state *sta){    int first = 0;    int second = 0;    int third = 0;    first = fgetc(pfin);    switch (first)    {    case '*':    {                second = fgetc(pfin);                switch (second)                {                case '*':                {                            third = fgetc(pfin);                            if (third=='/')                            fputc(first, pfout);                            *sta = NULL_State;                }                break;                case'/':                {          third = fgetc(pfin);                           *sta = NULL_State;                           if (third == '\n')                           {                               fputc(third, pfout);                            }                           else if (third=='/')                           {                               int forth = fgetc(pfin);                               if (forth == '*')                               {                                   fputc('\n', pfout);                                   fputc(third, pfout);                                   fputc('/', pfout);                                   *sta = C_State;                               }                                  }                           else                           {                               fputc('\n', pfout);                               fputc(third, pfout);                           }                }                    break;                default:                {                           fputc(first,pfout);                           fputc(second, pfout);                }                    break;                }    }        break;    case '\n':    {                 second = fgetc(pfin);                 switch (second)                 {                 case'*':                 {                            third = fgetc(pfin);                            if (third == '/')                            {                                fputc('\n', pfout);                                *sta = NULL_State;                            }                            else                            {                                fputc('/', pfout);                                fputc('/', pfout);                                fputc(second, pfout);                                fputc(third, pfout);                            }                 }                     break;                 default:                 {                            fputc('\n', pfout);                            fputc('/', pfout);                            fputc('/', pfout);                            fputc(second, pfout);                 }                     break;                 }    }        break;    default:        fputc(first, pfout);        break;    }}    void Do_CPP_State(FILE *pfin, FILE *pfout, enum state *sta){    int first = 0;    first = fgetc(pfin);    switch (first)    {    case '\n':        fputc(first, pfout);        *sta = NULL_State;        break;    default:        fputc(first, pfout);        break;    }}void CommentConvert(FILE *pfin, FILE *pfout){    enum state sta = NULL_State;    while (sta != END_State)    {        switch (sta)        {        case NULL_State:            Do_NULL_State(pfin, pfout, &sta);            break;        case C_State:            Do_C_State(pfin, pfout, &sta);            break;        case CPP_State:            Do_CPP_State(pfin, pfout, &sta);            break;        case END_State:            break;        default:            break;        }     }        printf("转换成功!\n");        fclose(pfin);        fclose(pfout);}

函数的测试部分:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include "CommentConvert.h"int main(){    FILE *pfin = NULL;    FILE *pfout = NULL;    pfin = fopen(INPUT, "r");    if (pfin == NULL)    {        perror("not open the file");        exit(EXIT_FAILURE);    }    pfout = fopen(OUTPUT, "w");    if (pfout == NULL)    {        perror("not open the file");        fclose(pfin);        exit(EXIT_FAILURE);    }    CommentConvert(pfin, pfout);    system("pause");    return 0;}

最后我们到文件中看一下结果:

/* 1.一般情况// 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
原创粉丝点击