1. 程式人生 > >【c語言】註釋轉換

【c語言】註釋轉換

輸入輸出函式知識連結

標頭檔案

#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;
}