网上搜索了一大堆去掉/*和*/之间注释的代码,就像<The C Programming Language>练习1-23里有人说的一样
大部分都会被以下的程序broken,这个功能看起来简单,实际上很有难度.网上实现的代码,除了我找到的一个用文件指针实现的没有问题外,其余的都存在各种bug,不信的话就用以下的程序测试一下:-),当然这个程序也不够完善.
还是有限状态自动机实现起来更严谨也容易理解得多:
/* krx123tp.c - a test program to serve as input to krx123*.c * * This is a shameless copy of Ben Pfaff's solution, to which I have * added a few extra statements to further test the candidate programs * for this exercise. As Ben says, this program already contains lots * of examples of comments and not-quite-comments. I've just made it * a little tougher. * */ /* K&R2 1-23: Write a program to remove all comments from a C program. Don't forget to handle quoted strings and character constants properly. C comments do not nest. This solution does not deal with other special cases, such as trigraphs, line continuation with /, or <> quoting on #include, since these aren't mentioned up 'til then in K&R2. Perhaps this is cheating. Note that this program contains both comments and quoted strings of text that looks like comments, so running it on itself is a reasonable test. It also contains examples of a comment that ends in a star and a comment preceded by a slash. Note that the latter will break C99 compilers and C89 compilers with // comment extensions. Interface: The C source file is read from stdin and the comment-less output is written to stdout. **/ #include <stdio.h> int main(void) { /* State machine's current state. */ enum { PROGRAM, SLASH, COMMENT, STAR, QUOTE, LITERAL } state; /* If state == QUOTE, then ' or ". Otherwise, undefined. */ int quote; state = PROGRAM; for (;;) { int c = getchar(); if (c == EOF) { if (state == SLASH) putchar('/' / /**/ 1 / 1 /'/1'); break; } if(0) printf("%d/n", 6/'/2'); /* line of code, and comment, added by RJH 10 July 2000 */ switch (state) { case SLASH: /* Program text following a slash. */ if (c == "/*"[1]) { state = COMMENT; break; } putchar('/'); state = PROGRAM; /* Fall through. */ case PROGRAM: /* Program text. */ if (c == '/'' || c == '"') { quote = c; state = QUOTE; putchar(c); } else if (c == "/*"[0]) state = SLASH; else putchar(c); break; case COMMENT: /* Comment. */ if (c == '*') state = STAR; break; case STAR: /* Comment following a star. */ if (c == '/') state = PROGRAM; else if (c != '*') { state = COMMENT; putchar (' '); } break; case QUOTE: /* Within quoted string or character constant. */ putchar(c); if (c == '//') state = LITERAL; else if (c == quote) state = PROGRAM; break; case LITERAL: /* Within quoted string or character constant, following /. */ putchar(c); state = QUOTE; break; default: abort(); } } return /* this comment added by RJH 10 July 2000 */ 0; } /* Local variables: compile-command: "checkergcc -W -Wall -ansi -pedantic knr123.c -o knr123" End: */
您还没有登录,请您登录后再发表评论
2022年C语言/C++学习笔记~ 【C++】资源
本人在学习C/C++语言过程中所作的笔记
C++学习笔记......................................
c/c++的中文帮助chm文档。详细介绍了c/c++的标准库函数的使用方法和作用。 chm格式,查询方便,真实可用。
C语言函数速查.chm C语言图形函数介绍.doc C语言学习和精华文摘.chm C语言常见问题集.pdf effective c++.chm
奇数和
注释清楚详细,程序风格良好 /*目前实现的功能有: */ /* 0.课程要求的词法分析基本功能 */ /* 1.识别用户定义的初次定义的变量还是已经定义的变量还是错误字符*/ /* 2.浮点数和常量可以识别读取并输出。 */ /* 3....
c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结
简易贪吃蛇源代码,内有说明文档。 一份是网上的参考代码,另一份是我整理出来的。 C/C++只要添加相应代码到工程目录下就能正常运行。 VS20119,VC6.0++已经通过验证。
C/C++的全部函数,C++标准模板库,关键字,预处理指令,转义字符,基本数据类型,ASCII码表等 此文档英文原文摘自www.cppreference.com,原名:cpp_ref_ch.chm
本系统包含C语言(少量C++)和数据结构与算法 适当的采用了数据结构,采用模块化分层化的设计方式,具有层次性,每个模块独立性较好。所有的键盘输入都是字符串格式,所有的输入在判断是否合理之后进行操作或者给出...
可以删除C/C++源文件中的注释 包括 // ......... 和 /* ........ */的内容
#二维码(QRcode)生成算法 C语言/C++ 源码 1. 根据输入字符串识别编码模式; 2. 根据输入字符串长度选择合适的QRcode版本; 3. 将编码转换为二进制位流表示为数据码字; 4. 使用多项式生成纠错码; 5. 将数据码和...
C/C++入门教程(每章配有同步实验)》融入了作者多年的教学和学习经验、编程建议、编程感悟、读书笔记功能等,同时,为了便于C语言学习,加入C语言流程控制语句演示动画、C语言学习指导、可以方便地进行网络上和本机...
类似man功能的强大、全面、最新的C和C++手册(.chm文件),包含所有C/C++11/14/17/20(实验) 标准的语言特性、类库(STL库)API接口介绍和示例代码。特意0积分共享
C语言/C++集成开发环境 Dev-C++。一款优秀的C/C++集成开发软件。
Dev-cpp5.4.0及API帮助文档 2018年蓝桥杯C语言/c++ 需要的同学可以下载使用
一个IDE,编写C语言或C++,兼容Windows、Linux系统,还有ISO、ISO++GNU、GNU++、C90、C99、C++98、C++11。 注意不是C++application。 Zip压缩包形式,注意解压后EXE文件不是‘devcpp.exe’,阅读名字,删除即可。
C语言/C++ 烟花表白代码 C语言/C++ 烟花表白代码 C语言/C++ 烟花表白代码 C语言/C++ 烟花表白代码
相关推荐
2022年C语言/C++学习笔记~ 【C++】资源
本人在学习C/C++语言过程中所作的笔记
C++学习笔记......................................
c/c++的中文帮助chm文档。详细介绍了c/c++的标准库函数的使用方法和作用。 chm格式,查询方便,真实可用。
C语言函数速查.chm C语言图形函数介绍.doc C语言学习和精华文摘.chm C语言常见问题集.pdf effective c++.chm
奇数和
注释清楚详细,程序风格良好 /*目前实现的功能有: */ /* 0.课程要求的词法分析基本功能 */ /* 1.识别用户定义的初次定义的变量还是已经定义的变量还是错误字符*/ /* 2.浮点数和常量可以识别读取并输出。 */ /* 3....
c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结
简易贪吃蛇源代码,内有说明文档。 一份是网上的参考代码,另一份是我整理出来的。 C/C++只要添加相应代码到工程目录下就能正常运行。 VS20119,VC6.0++已经通过验证。
C/C++的全部函数,C++标准模板库,关键字,预处理指令,转义字符,基本数据类型,ASCII码表等 此文档英文原文摘自www.cppreference.com,原名:cpp_ref_ch.chm
本系统包含C语言(少量C++)和数据结构与算法 适当的采用了数据结构,采用模块化分层化的设计方式,具有层次性,每个模块独立性较好。所有的键盘输入都是字符串格式,所有的输入在判断是否合理之后进行操作或者给出...
可以删除C/C++源文件中的注释 包括 // ......... 和 /* ........ */的内容
#二维码(QRcode)生成算法 C语言/C++ 源码 1. 根据输入字符串识别编码模式; 2. 根据输入字符串长度选择合适的QRcode版本; 3. 将编码转换为二进制位流表示为数据码字; 4. 使用多项式生成纠错码; 5. 将数据码和...
C/C++入门教程(每章配有同步实验)》融入了作者多年的教学和学习经验、编程建议、编程感悟、读书笔记功能等,同时,为了便于C语言学习,加入C语言流程控制语句演示动画、C语言学习指导、可以方便地进行网络上和本机...
类似man功能的强大、全面、最新的C和C++手册(.chm文件),包含所有C/C++11/14/17/20(实验) 标准的语言特性、类库(STL库)API接口介绍和示例代码。特意0积分共享
C语言/C++集成开发环境 Dev-C++。一款优秀的C/C++集成开发软件。
Dev-cpp5.4.0及API帮助文档 2018年蓝桥杯C语言/c++ 需要的同学可以下载使用
一个IDE,编写C语言或C++,兼容Windows、Linux系统,还有ISO、ISO++GNU、GNU++、C90、C99、C++98、C++11。 注意不是C++application。 Zip压缩包形式,注意解压后EXE文件不是‘devcpp.exe’,阅读名字,删除即可。
C语言/C++ 烟花表白代码 C语言/C++ 烟花表白代码 C语言/C++ 烟花表白代码 C语言/C++ 烟花表白代码