- 浏览: 217475 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (110)
- java (111)
- c# winform tablelayoutpanel学习 合并行的布局及动态增加删除内部控件 (1)
- javascript常用正则 (1)
- 认识Java程序 (1)
- UniqTask for android (1)
- JAX-RS 从傻逼到牛叉 2:开发一个简单的服务 (1)
- Spring MVC 数据绑定的扩展 (1)
- 手机分辨率 (1)
- tomcat的favicon.ico的用法 (1)
- Cookie读写demo (1)
- hive相关操作文档收集 (1)
- 测试开发工程师的发展 (1)
- JSF入门十(自定义转换器) (1)
- 《你能行:微软精英的职场心里话》 (1)
- JNI程序如何检测C代码的内存泄漏 (1)
- 做了几天的调研工作 (1)
- 使用Microsoft Web Application Stress进行压力测试 (1)
- 在线共享音乐吧(Online Share Music Bar)解决方案 (1)
- 如何二次压缩RM和RMVB格式文件 (1)
- 突然想起了红色联盟 就去看了看 (1)
- 推荐两个关于DB2认证的站点 (1)
- 安装Microsoft .NET Framework SDK 快速入门、教程和示例 (1)
- 去掉C/C++程序代码中的注释 (1)
- 数据结构之kmp模式匹配 (1)
- JS跨域 (1)
- SP2-0734: 未知的命令开头 "exp test/t..." - 忽略了剩余的行 解决办法 (1)
- Android开发之fedora13下编译Android源码 (1)
- Android开发之Linkify (1)
- json学习之三:JSONArray的应用 (1)
- js 数组操作代码集锦 (1)
- jquery跨域调用json数据 (1)
- qtdemo浅析 (1)
最新评论
-
songshuang:
最近怎么都盗我的文
做个小调查,程序员们都是什么星座的?
程序员面试宝典上面的题目有很多是很经典的问题,可供我们思考,而且会对我们面试有很大好处。
下面是第45页的一个题目:编写一个函数,实现把C/C++程序代码中的注释去掉,我开始看的时候总是看不懂,后来在网上看到一个网友详细的分析了其代码,但是我看了之后觉得有好多地方他分析的都不对,于是,我自己又花了半天的时间分析了一遍,觉得自己理解了,下面给出我的分析语句。如果还有不严谨的部分,请指教!
/********************************************************<br>
功能:去除C/C++中的注释<br>
输入:指向C/C++程序代码的指针及长度<br>
来源:程序员面试宝典第45页
分析:一次读取一行,分两种情况,因为有两种注释:
(1)在读取到的一行中查找“//”,如果找到,则把“//”及其后的部分扔掉。
(2)在读取到的一行中查找“/*”,记录位置pos1,然后再在这行中查找“*/”,如果找到,也记录位置pos2,扔掉它们与其中的内容,以pos2开始,继续查找“/*”;如果在当前行中没有找到,则去掉当前行中“/*”及其后的内容,读取新的一行,查找“*/”,如没有。则去掉读取到的这一行,再读一行,查找“*/”,如找到,记录位置pos2,去掉这一行的0到pos2之间的字符。
(3)进行步骤1、步骤2,直到程序结束。
编程时要考虑的特殊情况i:
<img src="http://img.baidu.com/hi/babycat/C_0002.gif" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-color: initial;">“”中的“//”“/*”
<img src="http://img.baidu.com/hi/babycat/C_0012.gif" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-color: initial;">''中的“//”“/*”
<img src="http://img.baidu.com/hi/babycat/C_0004.gif" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-color: initial;">“//”与“/*”的嵌套关系,比如///* 、/* //*/<br>
*********************************************************/
#include <stdio.h><br>
#include <stdlib.h><br>
#include <fcntl.h><br>
#include <string.h><br>
#include <unistd.h><br>
#include <sys/types.h>
void remove_comment(char *buf, size_t size)<br>
{<br>
char *p, *end, c; //p-动态移动的字符指针,end-指向文件末尾的字符指针,c-存储没一个p指向的字符<br>
char *sq_start, *dq_start; //sq_start-单引号开始位置(single),dq_start-双引号开始(double)<br>
char *lc_start, *bc_start; //lc_start-//的开始位置,bc_start-/*的开始位置<br>
size_t len; //记录某符号结束和开始的位置之差(长度,偏移量)<br><br>
p = buf;<br>
end = p + size;<br>
sq_start = dq_start = NULL;<br>
lc_start = bc_start = NULL;<br><br>
while (p < end) /*当指针没有到达文件末尾*/<br>
{<br>
c = *p; //用字符变量c存储指针指向的字符<br><br>
switch (c) //根据c的值做相应处理<br>
{<br>
case '\'': /*处理单引号*/<br>
{<br>
if (dq_start || lc_start || bc_start) //当遇到过双引号、//或/*的时候,则不需要再判断'//'的情况了。<br>
{<br>
p++;<br>
continue; //继续下一个,对while而言的<br>
}<br>
/*******************************以下是没有遇到过双引号或//或/*的时候*******************************/<br>
if (sq_start == NULL) /****如果未遇到单引号****/<br>
{<br>
sq_start = p++; //start指向单引号的开始位置,p指向下一个
}<br>
else /*如果遇到过单引号,sq_start指向单引号开始位置*/<br>
{<br>
len = (p++) -sq_start;
if (len == 2 && *(sq_start+1) == '\\')
{
/*若遇到 “ '\'' ”这种情况则两个单引号并未匹配,遇到的“'”是“\' ”中的,而不是与sq_start所指向单引号匹配*/<br>
continue;<br>
}<br><br>
sq_start = NULL; //否则将sq_start置位为NULL
}<br>
/*******************************以上是没有遇到过双引号或//或/*的时候*******************************/<br>
break;<br>
}<br><br>
case '\"': /*处理双引号*/<br>
{<br>
if (sq_start || lc_start || bc_start) //当遇到过单引号、//或/*的时候,则不需要处理<br>
{<br>
p++;<br>
continue;<br>
}<br>
/*****************以下是没有遇到过单引号或//或/*的时候*****************/<br>
if (dq_start == NULL) /*如果没有遇到过双引号*/<br>
{<br>
dq_start = p++; //标记遇到了双引号<br>
}<br>
else if (*((p++) -1) =='\\')
{
/*若遇到 “"ab\''cd" ”这种情况则两个双引号并未匹配,遇到的“"”是“\"”中的,而不是与dq_start所指向双引号匹配*/<br>
continue;<br>
}<br>
dq_start = NULL; //如果双引号中不是//,标记为NULL<br>
/*****************以上是没有遇到过单引号或//或/*的时候*****************/<br>
}<br><br>
case '/': //斜杠,注意这个斜杠也可以是'//',"//",//,/*/中的第二个斜杠,但会在下面第二行代码中被忽略掉<br>
{<br>
if (sq_start || dq_start || lc_start || bc_start) //如果是单引号、双引号、斜杠、/*的后面<br>
{<br>
p++;<br>
continue;<br>
}<br>
/***********************下面是遇到注释//或/*的时候****************************/<br>
c = *(p + 1); //否则c取p指向字符的下一个字符<br>
if (c == '/') //遇到了双斜杠<br>
{<br>
lc_start = p; //标记双斜杠的开始<br>
p += 2; //p指向双斜杠后面的字符<br>
}<br>
else if (c == '*') //遇到了/*<br>
{<br>
bc_start = p; //标记/*的开始<br>
p += 2; //p指向/*后面的字符<br>
}<br>
/*************************上面是遇到注释//或/*的时候**************************/<br>
else<br>
{
p++;<br>
}<br>
}<br><br>
case '*': //星号,同斜杠,但少了如果遇到/*的情况,因为遇到这种情况后,要判断是不是遇到结束的地方*/了<br>
{<br>
if (sq_start || dq_start || lc_start) //如果是单引号、双引号、斜杠、/*的后面<br>
{<br>
p++;<br>
continue;<br>
}<br><br>
if (*(p + 1) != '/') //如果星号后面紧跟的不是斜杠,那么忽略过。<br>
{<br>
p++;<br>
continue;<br>
}<br><br>
p += 2; //否则p指向斜杠后面那个字符。注意下面的清空语句,p指向的那个字符并不会被清除。<br>
memset(bc_start, ' ', p-bc_start); //清空/* …… */中间的内容包括注释符号本身。<br>
bc_start = NULL;<br>
break;<br>
}<br><br>
case '\n': /*换行符,主要处理遇到双斜杠时,需要清除双斜杠到\n的前面的字符*/<br>
{<br>
if (lc_start == NULL) //如果还没有遇到双斜杠,那么忽略<br>
{<br>
p++;<br>
continue;
}<br><br>
c = *(p - 1);<br>
/*如果遇到过双斜杠,清空双斜杠本身和到\n前面的那个字符,p指向下一个字符,/r是回车符(光标退回到最前面),这里要判断
c == '\r'是因为在UNIX系统下文件结尾的换行只有\n,而windows系统下文件结尾的换行为\r\n */
memset(lc_start, ' ', (c == '\r'? ((p++) -1) : p++) - lc_start);<br>
lc_start = NULL;<br>
break;<br>
}<br><br>
default:<br>
p++;<br>
break;<br>
}<br>
/****************************************************<br>
如果遇到双斜杠,这个if语句存在的意义在于万一最后<br>
一行代码是带有双斜杠但没有给换行符\n的,也要清除掉。<br>
*****************************************************/<br>
if (lc_start)<br>
{<br>
memset(lc_start, ' ', p - lc_start);<br>
}<br>
}<br>
}
/**********************************************<br>
main函数的开始<br>
***********************************************/<br>
int main (int argc, char *argv[])<br>
{<br>
int fd, n;<br>
char buf[102400];<br><br>
if (argc != 2)<br>
{<br>
printf("command error: Input as ./command <file>\n");<br>
}<br><br>
fd = open(argv[1], O_RDONLY); /*只读打开*/<br>
if (fd == -1)<br>
{<br>
return -1;<br>
}<br><br>
n = read(fd, buf, sizeof(buf));<br>
if (n == -1 || n == 0)<br>
{<br>
close(fd);<br>
return -1;<br>
}<br>
printf("test\n");<br>
remove_comment(buf, n);<br>
*(buf + n) = '\0';<br>
printf("%s", buf);<br>
close(fd);<br><br>
return 0;<br>
}
发表评论
-
qtdemo浅析
2012-02-07 16:14 1572[size=x-small;]? ? <span ... -
jquery跨域调用json数据
2012-02-03 11:39 1424? <script type="te ... -
js 数组操作代码集锦
2012-02-03 10:59 1139[size=small;]这段时间做的一个项目,用到数 ... -
json学习之三:JSONArray的应用
2012-02-02 15:29 71503从json数组中得到 ... -
Android开发之Linkify
2012-01-31 13:33 2202<h1>Android开发之Linkify ... -
Android开发之fedora13下编译Android源码
2012-01-11 16:04 1146<h1>Android开发之fedora1 ... -
SP2-0734: 未知的命令开头 "exp test/t..." - 忽略了剩余的行 解决办法
2011-12-28 14:13 3853<span style="font-f ... -
JS跨域
2011-12-21 16:43 2626原帖地址:http://itgeeker.com/ma ... -
数据结构之kmp模式匹配
2011-12-21 10:04 1178KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说 ... -
安装Microsoft .NET Framework SDK 快速入门、教程和示例
2011-12-19 10:09 2047Microsoft .NET Framework SD ... -
推荐两个关于DB2认证的站点
2011-12-19 09:59 846关于DB2认证的在线中文教程<br>htt ... -
突然想起了红色联盟 就去看了看
2011-12-17 10:54 1172突然想起了红色联盟,于是就偷偷的爬上红盟站点,看了看红 ... -
如何二次压缩RM和RMVB格式文件
2011-12-16 17:12 1111对RM/RMVB格式文件进行二次压缩,可以用一个软件E ... -
在线共享音乐吧(Online Share Music Bar)解决方案
2011-12-14 19:54 994</span></font>& ... -
使用Microsoft Web Application Stress进行压力测试
2011-12-14 18:33 872<font size="2" ... -
做了几天的调研工作
2011-12-14 17:29 1007</span></span> ... -
JNI程序如何检测C代码的内存泄漏
2011-12-13 14:59 1438Java调用C的JNI程序很容易出现内存泄漏问题,因为 ... -
《你能行:微软精英的职场心里话》
2011-12-12 14:39 955<p class="MsoNorm ... -
JSF入门十(自定义转换器)
2011-12-09 11:00 971本文参考 http://www.javaworld.c ... -
测试开发工程师的发展
2011-12-09 01:59 1478非常好的文章,转至:http://www.pyfans ...
相关推荐
综上所述,这个C/C++源程序去注释工具提供了一个处理源代码注释的实用功能,它基于 Turbo C 编程环境,用户可以通过运行RMCOMM.EXE来执行去注释操作,而RMCOMM.C则是实现该功能的源代码,可供学习和研究。...
标题中的"C/C++/Java 源代码注释清除工具"是一个专门针对这三种编程语言设计的实用程序,它的主要功能是移除源代码文件中的注释。在软件开发过程中,注释对于理解和维护代码至关重要,但在特定情况下,如代码混淆、...
C语言注释删除程序 [程序功能] 1、删除注释,包括块注释(/**/)和行注释(//) 2、删除空白行 3、用指定数量的空格替换TAB字符 [使用方法] 1、在WINDOWS的CMD窗口中键入行命令 2、使用WINDOWS的批处理文件(.BAT...
网上众多的开源C/C++代码,因为跨平台的需要,参杂了许多的条件编译语句,对阅读源代码造成了不方便,而且用ctags等工具生成源代码的tags文件时会有些妨碍,本工具就是用来预处理这些条件编译的,将未定义的区域自动...
本文将深入探讨如何去除C++源文件中的注释,包括行注释和块注释,并结合给定的文件列表进行分析。 首先,C++中的注释主要有两种类型:行注释和块注释。行注释以`//`开头,直到行尾;块注释以`/*`开始,以`*/`结束,...
给定 C/C++ 源程序的源代码,要求去掉所有的注释代码并输出去除注释后的代码。已知 C/C++ 代码的注释有两种:单行注释和多行注释,前者稳以“ // ”引导的行;后者则是由“ /* ”和“ */ ”包含的部分,可以在同一...
本篇文章将详细探讨如何去除C++代码中的单行注释(//注释)和多行注释(/**/注释),以及可能涉及到的相关技术。 首先,我们要理解C++中的注释结构。单行注释以`//`开始,直到行尾结束;而多行注释则以`/*`开始,`*...
对于本文所述的任务,我们将利用状态机的概念来识别和去除C++代码中的注释。 #### C++中的注释类型 在C++中,存在两种类型的注释: 1. **单行注释**:以`//`开头,直到行尾的所有内容都是注释。 2. **多行注释**:...
这个"Qt编写移除C++代码注释源码"项目提供了一个用Qt5实现的解决方案,它可以帮助我们快速地自动化这个过程。 Qt是一个跨平台的应用程序开发框架,主要用于C++编程,同时也支持QML。Qt5是其最新版本,引入了许多新...
批量删除C和C++注释 1.目前支持去掉.h .hpp .c .cpp .java 这些以//或/**/为注释符的源文件 2.支持递归遍历目录 3.当前版本为Python2.7版本,故只有安装了Python2.7(或Python3.x以下版本的才可以直接使用,测试...
在C++编程中,注释是程序员为了提高代码可读性而添加的非执行文本。它们分为单行注释(`// comment`)和多行注释(`/* comment */`)。然而,在某些特定场景下,例如代码分析、编译优化或者特定的处理流程中,可能...
在编程世界中,源代码注释是极其重要的,它们提供了对程序逻辑的解释,帮助开发者理解和维护代码。然而,在某些特定情况下,如编译优化、代码混淆或仅需执行无注释版本时,可能需要去除源代码中的注释。本文将深入...
《C类语言源代码注释去除程序 V1.0绿色》是一款专为处理C类语言(包括C、C++)源代码设计的实用工具,旨在帮助程序员高效地去除代码中的注释部分,使得源代码更加简洁,便于阅读和分析。在软件开发过程中,注释虽然...
c/c++词法分析预处理cpp源代码,将同目录下"abc.cpp"去除跳格回车换行注释和不必要的空格,输出文件"abc_chuli.cpp",因为具体要求不同,这处理出来的文件还是能继续编译运行。
给定 C/C++源程序的源代码,要求去掉所有的注释代码并输出去除注释后的代码。已知 C/C++ 代码的注释有两种:单行注释和多行注释,前者稳以“//”引导的行;后者则是由“/*”和 “*/”包含的部分,可以在同一行内,也...
总的来说,这个工具提供了一种方便的方式来处理C和C++源代码,去除其中的注释和空行,适用于代码优化、分析或者版本控制等场景。通过图形界面,使得操作更加直观,提升了用户的使用体验。对于需要处理大量C/C++代码...
1.功能:此程序能够去除 C++程序源文件中的所有注释,能识别“//”与“/**/”两种注释 2.用法:将待清理的 C++源代码 存为纯文本形式“test.txt”,将文本文件copy到CommentCleaner.exe同一个文件夹内,运行 ...
综上所述,这个VC6工程提供了去除C++代码中空行和注释的功能。通过解析和处理源代码,状态机算法可以有效地识别并跳过注释部分,同时过滤掉空行。这对于代码的整理和分析非常有用,尤其是在需要去除无关信息以便进行...
- 对于C/C++面试,重点应放在掌握语言基础、数据结构、算法、内存管理、指针操作、面向对象编程(C++中)等方面。 - 实际问题解决能力很重要,如上述题目所示,理解题意、调试代码和优化算法都是面试中常见的考核...
本资源摘要信息介绍了一个C程序代码分析器,旨在统计程序中代码、注释和空行的行数,以及函数的个数和平均行数,并对程序风格进行评价。 知识点: 1. C程序分析:本资源摘要信息主要介绍了如何读取一个C程序,统计...