注释转换

AnnotationConversion.h

# pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <errno.h>
typedef enum State
{
 c_BEGIN,
 c_END
}State;
typedef enum RunState
{
 SUCCESS,
 FILE_WRONG,
 NO_MATCH
}RunState;
RunState AnnotationConvert(const char* input,const char* output);

AnnotationConversion.c

#include "AnnotationConversion.h"
RunState convert(FILE* input, FILE* output)
{
 char first,second;
 RunState ret = SUCCESS;
 State tag = c_END;
 assert(input);
 assert(output);
 do{
  first = fgetc(input);
  switch(first)
  {
   case '/':
    second = fgetc(input);
    if(second == '*')
    {
     //3.匹配问题
     if(tag == c_END)
     {
      fputc('/',output);
      fputc('/',output);
      tag = c_BEGIN;
     }
     else
     {
      fputc('/', output);
      fputc('*', output);
     }
    }
    else if(second == '/')//C++注释问题
    {
     char next;
     fputc(first, output);
     fputc(second, output);
     do
     {
      next = fgetc(input);
      fputc(next, output);
      if(next == EOF)
      {
       return ret;
      }
     }while(next != '\n');
    }
    else
    {
     fputc(first, output);
     fputc(second, output);
    }
    break;
   case '\n'://4.多行注释问题
    if(tag == c_BEGIN)
    {
     fputc(first, output);
     fputc('/', output);
     fputc('/', output);
    }
    else
    {
     fputc(first, output);
    }
    break;
   case '*':
    second = fgetc(input);
    if(second == '/')
    {
     //2.换行情况
     char next = fgetc(input);
     if(next == '/')//5.连续注释问题
     {
      fputc('\n', output);
      fseek(input, -1, SEEK_CUR);
     }
     else if(next != '\n'&& next != EOF)
     {
      fputc('\n', output);
      fputc(next, output);
     }
     else
     {
      fputc('\n', output);
     }
     tag = c_END;
    }
    else if(second == '*')//6.连续的***/问题
    {
     fputc(first, output);
     fseek(input, -1, SEEK_CUR);
    }
    else
    {
     fputc(first,output);
     fputc(second,output);
    }
    break;
   
   default:
    if(first != EOF)
    {
     fputc(first,output);
    }
    break;
  }
 }while(first != EOF);
 if(tag == c_BEGIN)
 {
  return NO_MATCH;
 }
}
RunState AnnotationConvert(const char* inputFile,const char* outputFile)
{
 FILE* fIn,*fOut;
 RunState ret;
 fIn = fopen(inputFile, "r");
 if(fIn == NULL)
 {
  printf("%s文件打开失败 Error:%d\n",inputFile,errno);
  return FILE_WRONG;
 }
 fOut = fopen(outputFile, "w");
 if(fOut == NULL)
 {
  fclose(fIn);
  printf("%s文件打开失败 Error:%d\n",outputFile,errno);
  return FILE_WRONG;
 }
 ret = convert(fIn,fOut);
 fclose(fIn);
 fclose(fOut);
 return ret;
}

Test.c

#include <stdlib.h>
#include "AnnotationConversion.h"
int main()
{
 RunState ret;
 ret = AnnotationConvert("inputFile.c"," outputFile.c");
 if(ret ==SUCCESS)
 {
  printf("SUCCESS");
 }
 else if(ret == FILE_WRONG)
 {
  printf("FILE_WRONG");
 }
 else
 {
  printf("NO_MATCH");
 }
 system("pause");
 return 0;
}

inputFile.c

1.一般情况

/*int m = 0;*/

2.换行问题

/*int i = 0;*/int j = 0;

/*int i = 0;*/

int j = 0;

3.匹配问题

/*int i = 0/*j = 0*/

4.多行注释问题

/*

int i = 0;

int j = 1;

*/int k = 2;

5.连续注释问题

/*aaa*//*bbb*/

6.连续的***/问题

/***/

7.c++注释问题

//   /*int i = 0;

outputFile.c

1.一般情况

//int m = 0;

2.换行问题

//int i = 0;

int j = 0;

//int i = 0;

int j = 0;

3.匹配问题

//int i = 0/*j = 0

4.多行注释问题

//

//int i = 0;

//int j = 1;

//

int k = 2;

5.连续注释问题

//aaa

//bbb

6.连续的**

问题

//*

7.c++注释问题

//   /*int i = 0;

你可能感兴趣的:(注释,转换)