【c語言】註釋轉換
阿新 • • 發佈:2018-12-10
輸入輸出函式知識連結
標頭檔案
#ifndef _COMMENT_CONVERT_H_
#define _COMMENT_CONVERT_H_
#include<stdio.h>
#include<stdlib.h>
enum State
{
NUL_STATE,//無註釋狀態
C_STATE,//C註釋狀態
CPP_STATE,//C++註釋狀態
END_STATE//結束狀態
};
void CommentConvert(FILE* pfIn, FILE *pfOut); //註釋狀態
void DoCState(FILE* pfIn, FILE *pfOut, enum State* ps);//C狀態
void DoCppState(FILE* pfIn, FILE *pfOut, enum State* ps);//C++狀態
void DoNulState(FILE* pfIn, FILE *pfOut, enum State* ps);//結束
#endif
函式部分
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentConver.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 ;
default:
break;
}
}
}
void DoCState(FILE* pfIn, FILE *pfOut, enum State* ps)
{
int first = 0;
int second = 0;
int third = 0;
first = fgetc(pfIn);
switch (first)
{
case '*':
{
second = fgetc(pfIn);
switch (second)
{
case '/'://進入C狀態後如果讀到*/就說明結束了C狀態的註釋
third = fgetc(pfIn);//這裡只是考慮避免註釋到了正文
if (third == '\n')
{
fputc(third, pfOut);
}
else
{
ungetc(third, pfIn);//讀到非\0時就是*/後面有正文內容,所以回退一下
fputc('\n', pfOut);
}
*ps = NUL_STATE;
break;
case '*':
fputc(first, pfOut);
ungetc(second, pfIn);//遇到兩個*,則第一個是正文的*
break;
default:
fputc(first, pfOut);
break;
}
}
break;
case '\n'://C註釋換行問題
fputc(first, pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
break;
case EOF:
fputc(first, pfOut);
*ps = END_STATE;
default:
fputc(first, pfOut);
break;
}
}
void DoCppState(FILE* pfIn, FILE *pfOut, enum State* ps)
{
int first = 0;
int second = 0;
first = fgetc(pfIn);
switch (first)
{
case '\n':
{
fputc('\n', pfOut);
*ps = NUL_STATE;
}
break;
case EOF:
fputc(first, fputc('\n', pfOut));
*ps = NUL_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoNulState(FILE* pfIn, FILE *pfOut, enum State* ps)
{
int first = 0;
int second = 0;
int third = 0;
first = fgetc(pfIn);
switch (first)
{
case '/':
second = fgetc(pfIn);
switch (second)
{
case '*':
{
fputc('/', pfOut);//當讀到/*時相當於是C狀態,狀態改變為C狀態
fputc('/', pfOut);//然後把C註釋的標誌/*變為C++註釋的標誌//
*ps = C_STATE;
}
break;
case '/':
{
fputc(first, pfOut);//遇到//相當於C++狀態,不用轉換直接把讀到的標誌寫進去
fputc(second, pfOut);
*ps = CPP_STATE;//狀態變為C++狀態
}
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
break;
case EOF://遇到EOF直接把狀態變為結束
fputc(first, pfOut);
*ps = END_STATE;
break;
default:
fputc(first, pfOut);//沒有讀到註釋的標註就直接把讀到的寫進去
break;
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentConver.h"
void test()
{
FILE* pfIn = NULL;
FILE* pfOut = NULL;
pfIn = fopen("input.c","r");
if (NULL == pfIn)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
pfOut = fopen("output.c", "w");
if (NULL == pfOut)
{
perror("open file for write");
fclose(pfIn);
exit(EXIT_FAILURE);
}
CommentConvert(pfIn, pfOut);
}
int main()
{
test();
system("pause");
return 0;
}