c语言小项目---注释转换

```

//CommentConvert.h文件
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#include <stdio.h>
#include <stdlib.h>
enum Status
{
    NUL_STATUS,//无状态
    C_STATUS,//C状态下
    CPP_STATUS,//在C++状态下
    END_STATUS//结束状态
};
void CommentConvert();
void DoConvertWork(FILE* pfIn, FILE* pfOut);
void DoNulStatus(FILE* pfIn, FILE* pfOut, enum Status* status);
void DoCStatus(FILE* pfIn, FILE* pfOut, enum Status* status);
void DoCppStatus(FILE* pfIn, FILE* pfOut, enum Status* status);
#endif        //__COMMENT_CONVERT_H__
//ConmmentConvert.c文件
#define _CRT_SECURE_NO_WARNINGS 1  
#include"CommentConvert.h"
enum STATUS status = NUL_STATUS;
void DoNulStatus(FILE *pfIn, FILE *pfOut, enum Status*status)
{
    int first = 0;
    int second = 0;
    first = fgetc(pfIn);
    switch (first)
    {
    case '/':
        second = fgetc(pfIn);
        if (second == '/')
        {
            fputc('/', pfIn);
            fputc('/', pfOut);
            *status = CPP_STATUS;   //在无状态下遇到"//"直接将"//"写进去,并进入cpp状态  
        }
        else if (second == '*')
        {
            fputc(first, pfIn);
            fputc('/', pfOut);
            *status = C_STATUS;//在无状态下遇到/*要将/*变成//写进去,并进入c状态  
        }
        else
        {
            fputc(first, pfOut);
            fputc(second, pfOut);//遇到其他字符时直接写进去,状态不改变。  
        }
        break;
    case EOF:
        status = END_STATUS;//如果遇到EOF,进入结束状态  
        break;
    case '"':
        fputc(first, pfOut);
        //state = STR_STATUS;//如果遇到",进入字符串状态  
        break;
    default:
        fputc(first, pfOut);//其他情况的字符,直接写进去就行  
        break;
    }
}
void DoCStatus(FILE *pfIn, FILE *pfOut, enum Status* status)
{
    int first = 0;
    int second = 0;
    first = fgetc(pfIn);
    switch (first)
    {
    case '*':
        second = fgetc(pfIn);
        if (second == '/')  // 遇到*/ 说明c的注释结束,切换到无状态  
        {
            status = NUL_STATUS;
            second = fgetc(pfIn);
            if (second != '\n')
            {
                fputc('\n', pfOut);    //如果/后边的字符不是回车,需要写进去回车,然后再把独到的字符放回  
                ungetc(second, pfIn);
            }
            else
            {
                ungetc(second, pfIn);//如果是回车,把回车放回  
            }
        }
        else
        {
            fputc(first, pfOut);//如果遇到*,但是后边不是/,把*放进去,*后边的字符放回
        }
        break;
    case '\n':
        fputc(first, pfOut);//如果需要回车,回车写入,在写入//状态不变。  
        fputc('/', pfOut);
        fputc('/', pfOut);
        break;
    default:
        fputc(first, pfOut);
        break;
    }
}
void DoCppStatus(FILE *pfIn, FILE *pfOut, enum Status*status)
{
    int first = 0;
    int fgetc(pfIn);
    first = fgetc(pfIn);
    switch (first)
    {
    case '\n':
        fputc(first, pfOut);//cpp状态,如果遇到回车,cpp状态结束,无状态  
        status = NUL_STATUS;
        break;
    default:
        if (first == EOF)
        {
            status = END_STATUS;
        }
        else
        {
            fputc(first, pfOut);
        }
        break;
    }
}

void DoConvertWork(FILE*pfln, FILE*pfOut)
{
    enum STATE status = NUL_STATUS;
    while (status != END_STATUS)
    {
        switch (status)
        {
        case NUL_STATUS:
            DoNulStatus(pfln, pfOut, &status);
            break;
        case C_STATUS:
            DoCStatus(pfln, pfOut, &status);
        case CPP_STATUS:
            DoCppStatus(pfln, pfOut, &status);
            break;
        }
    }
}
void CommentConvert(FILE *pfIn, FILE *pfOut)
{
    while (status != END_STATUS)
    {
        switch (status)
        {
        case NUL_STATUS:
            DoNulStatus(pfIn, pfOut,&status);
            break;
        case C_STATUS:
            DoCStatus(pfIn, pfOut, &status);
            break;
        case CPP_STATUS:
            DoCppStatus(pfIn, pfOut, &status);
            break;
        case END_STATUS:
            break;
        }
    }
}
//test.c测试文件
#define _CRT_SECURE_NO_WARNINGS 1  
#include"CommentConvert.h"  
void test()
{
    CommentConvert();
}
int main()
{
    FILE *pfIn= NULL;
    FILE *pfOut = NULL;
    printf("注释开始\n");
    pfIn = fopen("input.FIlE ","r");
    if (NULL == pfIn)
    {
        perror("open file for read");
        exit(EXIT_FAILURE);
    }
    pfOut = fopen("Output.FILE", "w");
    if (NULL == pfOut)
    {
        fclose(pfIn);
        perror("open file for write");
        exit(EXIT_FAILURE);
    }
    CommentConvert(pfIn, pfOut);
    printf("注释结束\n");
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值