一门计算机语言如果想要运用的得心应手,离不开长久的练习,针对C语言的用法,下面主要是用C语言来解决注释转换的问题,C语言中注释是以/*开始,以*/结束,C++语言中可以通过//来注释,这里不考虑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*/

// 8.C注释本身不匹配
/* int i = 0;


下面是具体的程序代码:

#pragma once

#include 
#include 

typedef enum State     //解决匹配问题     /*int i = 0;/*int j = 0;*/
{
    C_Start,
    C_End,
};

void convert(FILE * fin, FILE * fout)   //针对各种的注释进行转换
{
    char first, second;
    assert(fin);
    assert(fout);
    
    State tag = C_End;
    do
   {
       first = fgetc(fin);    //fgetc函数的功能是读取字符
       switch (first)
       {
           case '/':                //解决/*int i = 0;*/
               second = fgetc(fin);
               if (second == '*')
              {
                  if (tag == C_End)
                  {
                      fputc('/', fout);
                      fputc('/', fout);
                      tag = C_Start;
                   }
                  else
                  {
                      fputc('/', fout);
                      fputc('*', fout);
                   }
              }
              else if (second == '/')
             {
                 char next;
                 fputc(first, fout);
                 fputc(second, fout);
                 //解决c++注释嵌套c注释的问题
                  do
                 {
                     next = fgetc(fin);
                     fputc(next, fout);
                     if (next == EOF)    //解决c++注释后面多写EOF的情况
                    { 
                        return;
                     }
                 }while (next != '\n');
             }
             else
             {
                 fputc(first, fout);
                 fputc(second, fout);
              }
             break;
        case '\n':
            //处理多行注释问题
            fputc('\n', fout);
            if (tag == C_Start)
            {
                fputc('/', fout);
                fputc('/', fout);
             }
            break;
        case '*':
            second = fgetc(fin);
            if (second == '/')
           {
               char next = fgetc(fin);
               //处理连续注释问题
               if (next == '/')
               {
                   fputc('\n', fout);
                   fseek(fin, -1, SEEK_CUR);      
                   //fseek函数是将fin指针进行向前移位,具体的功能查文档进行解答
                }
               else if (next != '\n' && next != EOF)    //解决/*int i = 0;*/int j = 0;
               {
                   fputc('\n', fout);
                   fputc(next, fout);
               }
               else
              {
                  //解决/*int i = 0;*/ /n int j = 0;
                  fputc('\n', fout);     
              }
              tag = C_End;
          }
           else if (second == '*')
          {
              fputc('*', fout);
              fseek(fin, -1, SEEK_CUR);
           }
          else
          {
              fputc(first, fout);
              fputc(second, fout);
          }
          break;
      default:
          fputc(first, fout);     //将first读取的字符串写入fout指定的文件中
          break;
      }
    } while (first != EOF);
}


void Annotation(const char * inputFile, const char * outputFile)
{
     FILE * Fin, * Fout;    //定义两个文件指针
     Fin = fopen(inputFile, "r");     //“r”表示读操作
     if (Fin == NULL)
     {
         printf("打开文件%s失败!errno:%d\n", inputFile, errno);
         return;
     }
     
     Fout = fopen(outputFile, "w");    //"w"表示写操作
     if (Fout == NULL)
     {
         fclose(Fin);    //fclose关闭文件
         printf("打开文件%s失败!errno:%d\n", outputFile, errno);
         return;
     }
     
     convert(Fin, Fout);
     
     fclose(Fin);
     fclose(Fout);
}