【PTA】6-1 **删除C程序中的注释 (31 分)
请你编写一个函数,将C语言源程序中的注释全部删去。
函数原型
// 删除注释
void Pack(FILE *src, FILE *dst);
说明:参数 src 和 dst 均为文件指针,其中:src 指示原始程序文件,dst 指示整理后得到的文件。
C语言规定:注释以 /* 开始,以 / 结束。注释可以跨行,不允许嵌套。字符串中的 / 和 */ 不是注释。
此外C语言还规定:注释相当于一个空白字符。因此,注释被删除后应补入一个空格。
裁判程序
#include <stdio.h>
#include <ctype.h>
#include <string.h>
// 删除注释
void Pack(FILE *src, FILE *dst);
int main()
{
char sname[1024], dname[1024];
FILE *sfile, *dfile;
gets(sname);
gets(dname);
sfile = fopen(sname, "rb");
if (!sfile)
{
printf("%s 无法打开!\n", sfile);
}
dfile = fopen(dname, "wb");
if (!dfile)
{
printf("%s 无法打开!\n", dfile);
}
if (sfile && dfile)
{
printf("正在整理...");
Pack(sfile, dfile);
puts("整理完成!");
}
if (sfile)
{
fclose(sfile);
}
if (dfile)
{
fclose(dfile);
}
return 0;
}
/* 你提交的代码将被嵌在这里 */
思路
在没到文本末尾持续读取
每次开头判断是否读取到EOF,读到则退出
默认初始状态是普通状态
如果是普通状态
- 判断第一个是/,读取下一个,如果是*,改变状态为多行注释,如果是/,改变状态为单行注释,如果是其他,输出这两个字符。
- 判断第一个是单引号,输出单引号,改变状态为字符
- 判断第一个是是双引号,输出双引号,改变状态为字符串
- 判断第一个是其他照常输出
如果是单行注释状态
- 其他字符不输出
- 如果读到换行符,先输出一个空格,再输出换行,然后将状态换为普通状态
如果是多行注释状态
- 其他字符不输出
- 如果读到*号,读取下一个字符,如果是/,输出一个空格,将状态换为普通状态。
如果是字符状态
- 所有字符照常输出
- 如果读到 ’ 号,将状态换为普通状态
如果是字符串状态
- 所有字符照常输出
- 如果读入的是双引号,输出后把状态换为普通状态
- 如果读取到\,则为转义字符,再读取下一个字符一起输出
代码
void Pack(FILE *src, FILE *dst)
{
#define IN_COMMON 1
#define IN_SINGLE 2
#define IN_MULTILINE 3
#define IN_CHARACTER 4
#define IN_STRING 5
int state = IN_COMMON;
int ch1;
int ch2;
while(!feof(src))
{
ch1 = fgetc(src);
if(ch1 == EOF)
break;
if(state == IN_COMMON)//在普通状态
{
if(ch1 == '/')
{
ch2 = fgetc(src);
if(ch2 == '/')//是单行注释
state = IN_SINGLE;
else if(ch2 == '*')//是多行注释
state = IN_MULTILINE;
else
{
fputc(ch1,dst);
fputc(ch2,dst);
}
}
else if(ch1 == '\'')
{
fputc(ch1,dst);
state = IN_CHARACTER;
}
else if(ch1 == '\"')
{
fputc(ch1,dst);
state = IN_STRING;
}
else
fputc(ch1,dst);
}
else if(state == IN_SINGLE)//单行注释状态
{
if(ch1 == '\n')
{
fputc(' ',dst);
fputc(ch1,dst);
state = IN_COMMON;
}
}
else if(state == IN_MULTILINE)//多行注释状态
{
if(ch1 == '*')
{
ch2 = fgetc(src);
if(ch2 == '/')
{
fputc(' ',dst);
state = IN_COMMON;
}
}
}
else if(state == IN_CHARACTER)//字符状态
{
if(ch1 == '\'')
{
fputc(ch1,dst);
state = IN_COMMON;
}
else
fputc(ch1,dst);
}
else if(state == IN_STRING)//字符串状态
{
if(ch1 == '\"')
{
fputc(ch1,dst);
state = IN_COMMON;
}
else if(ch1 == '\\')
{
ch2 = fgetc(src);
fputc(ch1,dst);
fputc(ch2,dst);
}
else
fputc(ch1,dst);
}
}
}
【PTA】6-1 **删除C程序中的注释 (31 分)的更多相关文章
- 怎样批量删除PDF文件中的注释
日常我们在阅读一些PDF文章时候,我们会发现有些PDF文章带有非常多的注释,显得非常不美观,影响了阅读体验.那么PDF文章里的批注应该怎么进行删除呢?怎样批量删除PDF文件中的注释? 操作教程: ...
- IDEA插件:快速删除Java代码中的注释
背景 有时,我们需要删除Java源代码中的注释.目前有不少方法,比如: 实现状态机.该方式较为通用,适用于多种语言(取决于状态机支持的注释符号). 正则匹配.该方式容易误判,尤其是容易误删字符串. ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何在程序中添加注释
在TwinCAT2中,(*中间输入注释*),也可以用这种方法批量注释,在TwinCAT3中,使用//即可 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youk ...
- 删除C代码中的注释行【状态机】
今天在学ruby时遇到的一个经典的题目,一直都知道但从来没有实现过.呈上状态机,代码略.(写代码的时候还是需要注意一些小情况的)
- LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S. 以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...
- 在MVC应用程序中,怎样删除上传的文件
在ASP.NET MVC应用程序中,怎样删除上传的文件. 由于上传时,真正文件是存储在应用程序某一目录,在数据库表中,只是存储其基本信息.在删除时,需要注意一下,由于没有事务可操作.Insus.NET ...
- 在DevExpress程序中使用Winform分页控件直接录入数据并保存
一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数 ...
- [转]MSI安装程序中的文件替换
原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装 ...
- 程序中保存状态的方式之Cookies
程序中保存状态的方式之 Cookies,之前写过一篇关于ViewState的.现在继续总结Cookies方式的 新建的测试页面login <%@ Page Language="C#&q ...
随机推荐
- HGAME2021 week2 pwn writeup
week2一共有4道pwn题 killerqueen 有格式化字符串漏洞,题不算难,但是故事情节真实让人摸不着头脑,但是仔细分析分析,理清楚逻辑就可以做了. 第一次choose1的时候,可以输入0,泄 ...
- 【译】使用 Visual Studio 调试外部源代码
您是否曾经需要调试并进入依赖于 NuGet 或 .NET 库的代码,而这些库并没有构建为您的解决方案的一部分? 现在,调试它们并不像调试作为解决方案一部分的项目那么容易.从 Visual Studio ...
- AtCoder Beginner Contest 169 题解
AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...
- CF24B F1 Champions 题解
Content 有 \(n\) 场已经进行完的赛车比赛,每场比赛给出前 \(m\) 名的名字.在每场比赛中,前 \(10\) 名的选手分别可以获得 \(25,18,15,12,10,8,6,4,2,1 ...
- LuoguP7106 双生独白 题解
Content 给定一个 十六进制颜色码(一个长度为 \(7\) 的字符串,意义详见题面),请输出其反色的十六进制颜色码. 数据范围:颜色的 R,G,B 值保证在 \(255\) 以内. Soluti ...
- java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏
画笔Graphics Java中提供了Graphics类,他是一个抽象的画笔,可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图. Graphics常用的画图方法如下: drawLine(): ...
- 使用xlsx实现Excel导入
需求 实现在系统里批量导入数据,通过上传一个excel文件,前端将文件处理为json数据发送给后端.(最好与后端定义好上传的文件模板,方便处理数据) 实现 使用xlsx: xlsx的github地址: ...
- IDEA设置maven打包的时候跳过单元测试
pom增加插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>mav ...
- c++使用map保存成员函数地址
note 本基于c++11介绍一种使用map保存成员函数地址 可避免使用 if 和 switch 配置灵活 方便, 代码维护效率高 结果: 范例开始 头文件包含 #include <iostre ...
- FilesCodingConvert--批量文件编码格式转换工具
FilesCodingConvert–批量文件编码格式转换工具 简介 最近开始学习使用Android Studio,因为它的方便易用,我打算以后就不在使用ADT的方式编写Android项目了.当从Ec ...