溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c語言走向c++的第一步,注釋轉(zhuǎn)換

發(fā)布時間:2020-07-05 17:37:04 來源:網(wǎng)絡 閱讀:342 作者:Zxiaoxue 欄目:編程語言

   最近剛開始學習c++,接觸了一個小項目,寫一個程序?qū)語言的注釋轉(zhuǎn)化為c++的注釋,這個里面也要分很多種情況,下面我就把我做的小程序分享出來,

在把C語言注釋轉(zhuǎn)化為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.連續(xù)注釋

  /**//**/  

 6.連續(xù)的**/問題

   /***/  

  7.c++注釋問題

 // /*xxxxxxxxxxx*/

  下面就分情況處理一下這幾種情況 首先,你要成功創(chuàng)建一個文件并能夠把C語言的注釋寫進去

void AnnotationConvert(const char* inputFile, const char* outputFile)
{
  FILE* fIn = fopen(inputFile, "r");//用只讀的方式打開一個文件
  //檢測文件是否打開成功,并輸出錯誤碼
  //只讀方式打開文件失敗,有可能是文件不存在或路徑錯誤等問題
if (fIn == NULL)
{
    printf("打開文件%s失敗,errno:%d", inputFile,errno);
    return;
}
  //寫方式打開文件失敗,這是要注意關(guān)閉已打開的fIn,否則可能導致內(nèi)存泄漏等問題
FILE* fOut = fopen(outputFile, "w");
if (fOut == NULL)
{
        fclose(fIn);//關(guān)閉文件流
printf("打開文件%s失敗,errno:%d", outputFile,errno);
return;
}
Convert(fIn, fOut);
  //打開文件成功,要注意關(guān)閉文件流
fclose(fIn);
fclose(fOut);

}
  
 在這里,可以定義兩個枚舉常量用來判斷是c語言注釋的開始還是結(jié)束
  typedef enum State
{
C_BEGIN,
C_END,
}State;
  
  void Convert(FILE* fIn, FILE*fOut)
{
  //斷言文件流
    assert(fIn);
assert(fOut);
    char first, second;//讀取兩個字符
State tag = C_END;
do
{
first = fgetc(fIn);
switch (first)
{
//1.普通情況 /*int i = 0;*/
case'/':
second = fgetc(fIn);
           if (second == '*')//當讀取的第一個字符為/第二個字符為*時
{
//3.匹配問題/*int i = 0;/*xxxxx*/ 
                if (tag == C_END)//判斷是否上一個C語言注釋已結(jié)束,即一個C語言注釋的開始,
                                  //若是,轉(zhuǎn)化為c++注釋的開始
{
fputc('/', fOut);
fputc('/', fOut);
tag = C_BEGIN;
}
                else               //若不是,按原樣輸出
{
fputc('/', fOut);
fputc('*', fOut);
}
}
            //7.c++注釋問題 
            // /*xxxxxxxxxxx*/ 
            else if (second == '/')    //當讀取的第一個字符為/且第二個字符也為/
{
                fputc('/', fOut);      //按原樣輸出
fputc('/', fOut);
                char next;             
do
{
next = fgetc(fIn); //讀取第三個字符并輸出它
fputc(next, fOut);
} while (next != '\n' && next != EOF);
}
else 
{
fputc(first, fOut);
fputc(second, fOut);
}
break;
case'*':
second = fgetc(fIn);
            if (second == '/')   //當?shù)谝粋€字符為*第二個字符為/時輸出一個換行
{
char next = fgetc(fIn);
//5.多行注釋  /**//**/
fputc('\n', fOut);
                if (next == '/') //當讀取的第三個字符也為/時,倒退讀取一個字符判斷是否為多行注釋的問題
{

fseek(fIn, -1, SEEK_CUR);//倒退讀取
}
//2.換行問題/*int i = 0;*/intj = 0;
                else if (next != '\n'&& next != EOF)
                 //當讀取的第三個字符不為換行不是/且不是文件結(jié)束的標志時,輸出第三個字符
{
fputc(next, fOut);
}
else 
{
fputc('\n', fOut);
}
                tag = C_END;
               //C語言注釋的結(jié)尾,將用作標志的枚舉常量置為end
}
//6.連續(xù)的**/問題 
                /***/ 
else if (second == '*')
              //當讀取的第二個字符為*時,輸出第一個字符且倒退讀取一個字符
{
fputc(first, fOut);
fseek(fIn, -1, SEEK_CUR);
}
else
{
fputc(first, fOut);
fputc(second, fOut);
}
break;
case'\n':
// 4.多行注釋
                /*int i = 0; 
                  int j = 0; 
                  int k = 0; 
                */int k = 0;
            //當讀取到的第一個字符為換行時首先輸出一個換行
fputc('\n', fOut);
if (tag == C_BEGIN)
            //判斷是否為一個C語言注釋的開始,若是,進行轉(zhuǎn)化
{
fputc('/', fOut);
fputc('/', fOut);
}
break;
default:
fputc(first, fOut);
break;
}
      }while (first != EOF);  //讀取到的字符不是文件結(jié)束
}

 這樣子一個注釋轉(zhuǎn)換的小項目就基本完成了

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI