用C語言實現從C到C++的註釋轉換

在C語言的學習過程中,在平時的程序編寫過程中,註釋這兩個字估計大家都不陌生。

今天,我就用C語言簡單的實現一下從C到C++的註釋轉換。

首先大概介紹一下從C到C++的註釋轉換中會遇到的幾個狀態:

接下來就是用C語言實現C到C++的註釋轉換的代碼:

CommentConvert.h


#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__


#include <stdio.h>
#include <stdlib.h>

enum STATE
{
END_STATE,
NUL_STATE,
C_STATE,
CPP_STATE
};

void DoNulState(FILE*pfIn, FILE*pfOut, enum STATE* s);
void DoCState(FILE*pfIn, FILE*pfOut, enum STATE* s);
void DoCppState(FILE*pfIn, FILE*pfOut, enum STATE* s);

#endif //__COMMENT_CONVERT_H__


CommentConvert.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConvert.h"
void DoNulState(FILE *pfin, FILE *pfout, enum STATE *s)//開始無狀態
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '/': //第一次讀取到的字符爲'/'
{
int sceond = fgetc(pfin);
switch (sceond)
{
case '/': //第二次讀取的字符也爲‘/’,即此註釋爲c++註釋
{
*s = CPP_STATE; //當前狀態轉變爲c++狀態
fputc(first, pfout);
fputc(sceond, pfout);
}
break;
case '*': //第二次讀取的字符也爲‘*’,即此註釋爲c註釋
{
*s = C_STATE;//當前狀態轉變爲c狀態
fputc('/', pfout);
fputc('/', pfout);
}
break;
default:// 其他註釋情況不用處理,直接讀取
{
fputc(first, pfout);
fputc(sceond, pfout);
}
break;
}
}
break;
case EOF://直接讀取到文件結束標誌,即文件結束
{
*s = END_STATE; //狀態轉換爲空狀態
}
break;
default: //第一次讀取的字符不是‘/’也不是‘EOF’,即爲其他情況
fputc(first, pfout);
break;
}
}
void DoCState(FILE *pfin, FILE *pfout, enum STATE *s) //C註釋狀態的註釋轉換
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '*': //註釋最後第一個讀取到的字符爲‘*’
{
int sceond = 0;
sceond = fgetc(pfin);
switch (sceond)
{
case '/': //第二個爲‘/’,即註釋結束
{
*s = NUL_STATE; //狀態轉換爲空狀態

fputc('\n', pfout);
}
break;
case '*': //遇到連續註釋問題 如/***/
{
fputc(first, pfout);
ungetc(sceond, pfin); //把讀取到的第二個字符‘*’還回去
}
break;
default://其它非註釋情況
{
fputc(first, pfout);
fputc(sceond, pfout);
}
}
}
break;
case '\n'://多行註釋問題
{
fputc(first, pfout);
fputc('/', pfout);
fputc('/', pfout);
}
break;
default://結尾直接是其他非註釋情況
{
fputc(first, pfout);
}
break;
}
}

void DoCppState(FILE *pfin, FILE *pfout, enum STATE *s)//c++註釋狀態的註釋轉換
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '\n': //一般情況
{
fputc(first, pfout);
*s = NUL_STATE;
}
break;
case EOF: // 文件讀取結束
{
*s = END_STATE;
}
break;
default://其他非註釋情況
fputc(first, pfout);
break;
}
}


test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "CommentConvert.h"

void CommentConvert(FILE *pfin, FILE *pfout)
{
enum state state = NUL_STATE;//開始賦值爲無狀態
while (state != END_STATE)//等於文件讀取結束狀態的話文件讀取結束
{
switch (state)//狀態的切換選擇
{
case NUL_STATE:
DoNulState(pfin, pfout, &state);
break;
case C_STATE:
DoCState(pfin, pfout, &state);
break;
case CPP_STATE:
DoCppState(pfin, pfout, &state);
break;
}
}
}
void test()
{
FILE *pfin = fopen("input.c", "r");//從文件裏面讀取東西
if (pfin == NULL)
{
perror("use open file read");
exit(EXIT_FAILURE);
}
FILE *pfout = fopen("output.c", "w");//往文件裏面寫東西
if (pfout == NULL)
{
perror("use open file write");
exit(EXIT_FAILURE);
}
//
CommentConvert(pfin, pfout);//調用轉換函數
fclose(pfin);
fclose(pfout);
}
int main()
{
test();
system("pause");
return 0;
}


接下來就是對該註釋轉換的代碼進行測試和實現

首先將test.c中的    (FILE *pfin = fopen("input.c", "r");//從文件裏面讀取東西 )這一條語句中的  'r' 進行修改,修改爲 ‘w’ ,先讓項目建立一個 input,c文件,然後將修改後的 ‘w’ 修改回原來的 ‘r’,打開 input.c進行輸入,然後再運行程序,則項目中出現一個 output.c,即註釋轉換後的文件。

如圖:


以上就是我用C語言對註釋轉換的理解實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章