c---注释转换

本文介绍了一个C/C++源代码注释转换程序的设计与实现。该程序能够将C风格的注释转换为C++风格,并处理多行注释及嵌套问题。通过解析不同注释状态并进行相应转换,确保了转换后的代码清晰易读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读取文件过程中的关键状态转换
主功能函数:

#include<stdio.h>         
#include"convert.h"        //引自己定义的头文件
int status = NULSTAT;      //定义全局变量,用于显示当前状态
void do_nul(FILE *ifp,FILE *ofp)//正常无注释情况下的工作
{
    char c = fgetc(ifp); //从文件中读取一个字符
    switch (c)      //判断字符c
    {
    case '/':       //若字符为‘/’,再判断下一个字符
    { char s = fgetc(ifp);
    switch (s)
    {
    case '/':
        fputc('/', ofp);
        fputc('/', ofp);
        status = CPPSTAT;  //c为/,s为/,进入c++注释
        break;
    case '*':
        fputc('/', ofp);
        fputc('/', ofp);
        status = CSTAT;   //c为/,s为*,进入c注释
        break;
    default:
        fputc('/', ifp);  //s为普通字符,输出‘/’
        break;
    }}
                 break;
    case '\n':   //字符c为换行符,输出换行符在目标文件,状态变为无
    //注释状态
        fputc(c, ofp);
        status = NULSTAT;
        break;
    case EOF:  //字符c为文件结束标志,则执行文件结束状态的工作
        status = EOFSTAT;
        break;
    default:
        fputc(c, ofp); //字符c为正常字符,则正常输出,状态变为
        //无注释状态
        status =NULSTAT;
        break;
    }
}
void do_c(FILE *ifp, FILE *ofp)  //c注释状态的工作
{                                //此工作状态下已有“/*”
    char c = fgetc(ifp);        //判断后续字符
    switch (c)
    {
    case '*':       //若碰见字符‘*’,判断是否注释结束
    {char s = fgetc(ifp);
    switch (s)
    {
    case '/':
        fputc('\n', ofp);   //   此时有“*/”
        status = NULSTAT;   //状态变为无注释状态
        break;
    default//否则输出字符*,将字符s退回到ifp;将状态变为c状态
        fputc(c, ofp);
        ungetc(s, ifp);
        status =CSTAT;
        break;
    }

    }
        break;
    case '\n'://若字符c为换行符,输出换行符,再输出c++注释符“//”
        fputc('\n', ofp);
        fputc('/', ofp);
        fputc('/', ofp);
        status = CSTAT;//状态为C注释
        break;
    case EOF:
        status = EOFSTAT;
        break;
    default:
        fputc(c, ofp);
        status = CSTAT;
        break;
    }
}
void do_cpp(FILE *ifp, FILE *ofp)  //c++注释状态下的工作
{
    char c = fgetc(ifp);
    switch (c)
    {
    case '\n':
        fputc(c, ofp);
        status = NULSTAT;
        break;
    case EOF:
        status = EOFSTAT;
        break;
    default:
        fputc(c, ofp);
        status = CPPSTAT;
        break;
    }
}
void convert(FILE *ifp, FILE *ofp)    //主函数
{
    while (status != EOFSTAT)  //判断状态,选择执行什么
    //状态下的工作
    {
        switch (status)
        {
        case NULSTAT:
            do_nul(ifp, ofp);
            break;
        case CSTAT:
            do_c(ifp, ofp);
            break;
        case CPPSTAT:
            do_cpp(ifp, ofp);
            break;
        case EOF:
            break;
        default:
            break;
        }
    }
}

自定义头文件
   #ifndef CONVERT_H
   #define CONVERT_H

   void convert(FILE *ifp, FILE *ofp);
    enum{NULSTAT,CSTAT,CPPSTAT,EOFSTAT};
   #define INPUT “input.txt”
    #define OUTPUT “output.txt”
   #endif                
 

    #include<stdio.h>
   #include<stdlib.h>
   #include"convert.h"
int main()
{
    FILE *ifp = fopen(INPUT, "r");
    FILE *ofp = fopen(OUTPUT, "w");
    if (ifp == NULL || ofp == NULL)
    {
        fprintf(stderr,"open file error");
        exit(1);
    }
    convert(ifp, ofp);
    fclose(ifp);
    fclose(ofp);
    system("pause");
    return 0;
}

测试用例:
// 1. 一般情况
int num = 0;
/* 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. 连续注释问题
/int a = 0;//int b = 0;/
// 6. 连续的 **/问/
// 7.C++ 注释问题

/ /*xxxxx

输出结果

// 1. 一般情况
int num = 0;
// 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. 连续注释问题
//int a = 0;
//int b = 0;

// 6. 连续的 **/问题
//*

// 7.C++ 注释问题
// /*xxxxxxxxxxxx*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值