C语言小项目—注释转换

本次这个小项目的目的是把.c文件中的C风格的注释转换成为C++风格的注释。

C注释风格:/**/

C++注释风格://

首先我们分析一下会出现的几种状态,以及各种状态之间的转换关系:

首先我们在这里对一些状态进行了标注,我们这里已知的有4种状态,

第一种是END_STATE

第二种是C_STATE

第三种是CPP_STATE

第四种是我们平时的NULL_state。

在这里,注释转换操作的是文件,所以接下来我么采用文件操作。

首先我们要打开input.c文件,对这个文件内部的文件进行读取,然后处理,否则直接提示用户有错误。

接下来,我们还要打开output.c文件,对处理以后的代码进行写入。

接下来,我们就要分析各种可能会遇到的情况:

input.c

// 1.一般情况
/* 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.连续注释问题
/**//**/

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

// 7.C++注释问题
// /*xxxxxxxxxxxx*/

在这里我们对这个小项目编写的方法和我们前面对通讯录的方式是一样的,采用三个文件封装,一个test.c文件封装测试文件,一个comment_covert.c文件封装实现函数,一个comment_covert.h文件封装头文件。

在这里对待每一个状态,我们就可以采取枚举常量。

static enum STATE
{
    NULL_STATE,
    C_STATE,
    CPP_STATE,
    END_STATE
};

然后你要清楚,现在我们所要处理的默认状态是从NULL_STATE,所以接下来我们实现NULL_STATE函数,然后我们借助上面我所绘制的各种状态之间的转换关系,我们可以知道,在这里我们最需要判断的是所检察的第一个字符是什么,在这里有三种情况:‘/’,普通字符,EOF,所以我们先要接收第一个字符,然后利用我们的有限状态机,当为’/’时,我们进行下一个字符的判断,判断是否为‘*’,如果是,那么我们接下来让state为C_STATE,如果是‘/’那么进入CPP_state,接下来,其他字符,按照限定自行做出编辑即可。

comment_covert.h


#ifndef __COMMENT_CONVERT_H
#define __COMMENT_CONVERT_H

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

#define READFILENAME "input.c"

#define WRITEFILENAME "output.c"

static enum STATE
{
    NULL_STATE,
    C_STATE,
    CPP_STATE,
    END_STATE
};

void CommentConvert(FILE *fRead, FILE *fWrite);

void Do_C_State(FILE *fRead, FILE *fWrite);

void Do_CPP_State(FILE *fRead, FILE *fWrite);

void Do_Null_state(FILE *fRead, FILE *fWrite);

#endif //!__COMMENT_CONVERT_H

comment_covert.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"comment_covert.h"

enum STATE state = NULL_STATE;

void Do_C_State(FILE *fRead, FILE *fWrite)
{
    char first = 0;
    char second = 0;
    char third = 0;
    first = fgetc(fRead);
    switch (first)
    {
    case‘*‘:
        second = fgetc(fRead);
        switch (second)
        {
        case‘/‘:
            third = fgetc(fRead);
            if (third != ‘\n‘)
                fputc(‘\n‘, fWrite);
            if (third == ‘/‘)
            {
                ungetc(third, fRead);
                state = NULL_STATE;
                break;
            }
                fputc(third, fWrite);
                state = NULL_STATE;
            break;
        case‘*‘:
            third = fgetc(fRead);
            fputc(first, fWrite);
            if (third == ‘/‘)
            {
                state=NULL_STATE;
            }
            break;
        default:
            fputc(first, fWrite);
            fputc(second, fWrite);
            break;

        }
        break;

    case‘\n‘:
        fputc(first, fWrite);
        fputc(‘/‘, fWrite);
        fputc(‘/‘, fWrite);
        break;
    case EOF:
        state = END_STATE;
        break;
    default:

        fputc(first, fWrite);
        break;

    }

}

void Do_CPP_State(FILE *fRead, FILE *fWrite)
{
    char first = 0;
    first = fgetc(fRead);
    switch (first)
    {
    case ‘\n‘:
        fputc(first, fWrite);
        state = NULL_STATE;
        break;
    case EOF:
        state = END_STATE;
        break;
    default:
        fputc(first, fWrite);
        break;
    }
}

void Do_Null_state(FILE *fRead, FILE *fWrite)
{
    char first = 0;
    char second = 0;
    first = fgetc(fRead);
    switch (first)
    {
    case‘/‘:
        second = fgetc(fRead);
        if (second == ‘*‘)
        {
            fputc(‘/‘, fWrite);
            fputc(‘/‘, fWrite);
            state = C_STATE;
        }
        else if (second == ‘/‘)
        {
            fputc(first, fWrite);
            fputc(second, fWrite);
            state = CPP_STATE;
        }
        else
        {
            fputc(first, fWrite);
            fputc(second, fWrite);
        }
        break;
    case EOF:
        state = END_STATE;
        break;
    default:
        fputc(first, fWrite);
        break;
    }
}

void CommentConvert(FILE *fRead, FILE *fWrite)
{

    while (state!=END_STATE)
    {
        switch (state)
        {
        case NULL_STATE:
            Do_Null_state(fRead, fWrite);
            break;
        case C_STATE:
            Do_C_State(fRead, fWrite);
            break;
        case CPP_STATE:
            Do_CPP_State(fRead, fWrite);
            break;
        default:
            break;
        }
    }

}

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"comment_covert.h"

int main()
{
    FILE *fRead = NULL;
    FILE *fWrite = NULL;
    printf("*****注释转换开始******\n");
    fRead = fopen(READFILENAME, "r");
    if (NULL == fRead)
    {
        perror("read of file");
        exit(EXIT_FAILURE);
    }

    fWrite = fopen(WRITEFILENAME, "w");
    if (NULL == fRead)
    {
        fclose(fRead);
        perror("write of file");
        exit(EXIT_FAILURE);
    }
    CommentConvert(fRead, fWrite);
    printf("*****注释转换结束******\n");
    fclose(fRead);
    fclose(fWrite);
    system("pause");
    return 0;
}

最终就可以完成这个小项目了,代码的分析需要一步一步来,想要解决问题,也不能急,一步一步分析,哪怕最费劲的进行单步调试。

时间: 2024-11-05 22:56:39

C语言小项目—注释转换的相关文章

c语言项目—注释转换(c——c++)

题目要求: 要将全部的c语言风格的注释转换为c++风格的注释,如下图所示,需要将input.c文件经过注释转换程序转换为output.c文件所示. 这是测试结果: 首先我们来分析一下这个题目,在做这个项目时,我们需要引进有限状态机这个概念.那我们先来了解一下什么是有限状态机. 有限状态机FSM是软件上一种常用的处理方法,他把复杂的控制逻辑分成有限个稳定状态,在每个状态上进行处理. 我们来画一下状态图: 所以我们把这个项目分成这几个状态. NUL_STATE, C_STATE,  CPP_STAT

小项目图像转换字符串

from PIL import Image im=r"C:\Users\Achoo\Desktop\love.PNG"#原始图片路径 im_path=r"C:\Users\Achoo\Desktop\LOVE.txt"#记事本路径 zifu="[email protected]#.%^&.()_{}><[email protected]"#字符集 def rgbx(r,g,b,a): gray = int(0.2126 * r

c语言小项目-使用mysql数据库的图书管理系统

VS2013通过MySQL方式连接到MySQL MySQL官网上C++的API有两个.一个是很成熟的mysql++,另一个是MySQL Connector/C++,近两年才出的,模仿JDBC做的,封装得很方便使用.这里使用的是mysql方式. 1.新建bookAdminSys工程 2.将文件夹MySQL目录下的include添加到VC++目录中的包含目录中,另外将文件夹MySQL目录下的lib添加到VC++目录中的库目录中 3.添加附加依赖项,将MySQL目录下的libmysql.lib添加到L

C语言小项目-基于TCP协议和SOCKET编程的网络通信系统

1.1 功能结构图   网络通信系统一共由4个模块组成,分别是点对点客户端.点对点服务端.服务器中转服务端.服务器中转客户端.这4个模块是成对使用的,点对点客户端和点对点服务端一起使用,服务器中转服务端和服务器中转客户端一起使用. 功能结构体如下图所示:  1.2 编写程序 网络通信程序分为2个模块实现,点对点模块和服务器中转模块. common.h #ifndef __COMMON_H__ #define __COMMON_H__ #include "stdafx.h" #inclu

注释转换——(小项目)

一门计算机语言如果想要运用的得心应手,离不开长久的练习,针对C语言的用法,下面主要是用C语言来解决注释转换的问题,C语言中注释是以"/*"开始,以"*/"结束,C++语言中可以通过"//"来注释,这里不考虑C++语言向下兼容C语言的特点,主要是想将"/*       */"注释符转换为"//     ".对于各种的注释情况,程序中能够实现各种各样的注释能够进行转换. 以下是一般人在编写程序时"注释

c语言走向c++的第一步,注释转换

最近刚开始学习c++,接触了一个小项目,写一个程序将C语言的注释转化为c++的注释,这个里面也要分很多种情况,下面我就把我做的小程序分享出来,在把C语言注释转化为c++注释的过程中,列举了以下几种情况 1.普通情况 /*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;

注释转换(C语言-&gt;C++)

最近做了一个注释转换的项目,将C语言注释转化为C++格式. 在这个项目中,我用到了有限状态机的思想.有限状态机,简称为状态机(finite-state machine),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 我先来介绍一下状态机.状态机简写为FSM(Finite State Machine),主要分为2大类:第一类,若输出只和状态有关而与输入无关,则称为Moore状态机:第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机.要特别注意的是,因为Mealy

小项目特供 贪吃蛇游戏(基于C语言)

C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第二天写了第二版和第三版. 相信C语言写个小游戏或小项目是大多数计算机相关专业的学生都做的事情,但是作为一个数学专业的学生,我们教研室的老师对C语言的要求也就比较低了,大一没有让我们做个小项目实践一次.至今为止用C/C++做过的三个小项目(大作业),一个是外校同学让我帮忙写的学生信息管理系统(天呐,这

ios学习笔记图片+图片解释(c语言 oc语言 ios控件 ios小项目 ios小功能 swift都有而且笔记完整喔)

下面是目录其中ios文件夹包括了大部分ios控件的介绍和演示,swift的时完整版,可以学习完swift(这个看的是swift刚出来一周的视频截图,可能有点赶,但是完整),c语言和oc语言的也可以完整的学习完所需知识,,其他文件夹的内容如其名说描述一样 没张图片都有文字说明,可以需要该功能的时候搜索一下然后打开图片就可以学习到 网盘下载地址:需要的话给留言我再传上去 http://www.cnblogs.com/langtianya原创 ios学习笔记图片+图片解释(c语言 oc语言 ios控件