【1-23】编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。再c语言中,注释不允许嵌套。
来源:互联网 发布:卫生间防水 知乎 编辑:程序博客网 时间:2024/06/04 18:01
状态机编程思想
@Link: http://www.cnblogs.com/zhanghaiba/p/3569928.html
http://blog.csdn.net/yuezhiren/article/details/7957823
以下为转载该题在状态机编程思想下详细解答过程
00)设正常状态为0,并初始为正常状态
每遍历一个字符,就依次检查下列条件,若成立或全部检查完毕,则回到这里检查下一个字符
01)状态0中遇到/,说明可能会遇到注释,则进入状态1 ex. int a = b; /
02)状态1中遇到*,说明进入多行注释部分,则进入状态2 ex. int a= b; /*
03)状态1中遇到/,说明进入单行注释部分,则进入状态4 ex. int a = b; //
04)状态1中没有遇到*或/,说明/是路径符号或除号,则恢复状态0 ex. <secure/_stdio.h> or 5/3
05)状态2中遇到*,说明多行注释可能要结束,则进入状态3 ex. int a = b; /*heh*
06)状态2中不是遇到*,说明多行注释还在继续,则维持状态2 ex. int a = b; /*hehe
07)状态3中遇到/,说明多行注释要结束,则恢复状态0 ex. int a = b; /*hehe*/
08)状态3中不是遇到/,说明多行注释只是遇到*,还要继续,则恢复状态2 ex. int a = b; /*hehe*h
09)状态4中遇到\,说明可能进入折行注释部分,则进入状态9 ex. int a = b; //hehe\
10)状态9中遇到\,说明可能进入折行注释部分,则维护状态9 ex. int a = b; //hehe\\\
11)状态9中遇到其它字符,则说明进入了折行注释部分,则恢复状态4 ex. int a = b; // hehe\a or hehe\<enter>
12)状态4中遇到回车符\n,说明单行注释结束,则恢复状态0 ex. int a = b; //hehe<enter>
13)状态0中遇到',说明进入字符常量中,则进入状态5 ex. char a = '
14)状态5中遇到\,说明遇到转义字符,则进入状态6 ex. char a = '\
15)状态6中遇到任何字符,都恢复状态5 ex. char a = '\n 还有如'\t', '\'', '\\' 等 主要是防止'\'',误以为结束
16)状态5中遇到',说明字符常量结束,则进入状态0 ex. char a = '\n'
17)状态0中遇到",说明进入字符串常量中,则进入状态7 ex. char s[] = "
18)状态7中遇到\,说明遇到转义字符,则进入状态8 ex. char s[] = "\
19)状态8中遇到任何字符,都恢复状态7 ex. char s[] = "\n 主要是防止"\",误以为结束
20)状态7中遇到"字符,说明字符串常量结束,则恢复状态0 ex. char s[] = "\"hehe"
前面说过,不同状态可以有相应的动作。比如状态0、5、6、7、8都需要输出当前字符,再考虑一些特殊情况就可以了。
读者实现时可以借助debug宏定义,将测试语句输出到标准错误输出,需要时可以重定位到标准输出,即2>&1,然后通过重定向|到more进行查看。
以下为转载源代码
/* *Copyright (C) Zhang Haiba *Date 2014-02-26 *File exercise1_23.c * *this program removes all comments in grammatical C code, *and as a integrity solution for exercise1-23 in <> */#include #define debug//#define debug(fmt, args...) fprintf(stderr, fmt, ##args)void dfa();int main(void){ dfa(); return 0;}void dfa(){ int c, state; state = 0; while ((c = getchar()) != EOF) { if (state == 0 && c == '/') // ex. [/] state = 1; else if (state == 1 && c == '*') // ex. [/*] state = 2; else if (state == 1 && c == '/') // ex. [//] state = 4; else if (state == 1) { // ex. [ or 5/3] putchar('/'); state = 0; } else if (state == 2 && c == '*') // ex. [/*he*] state = 3; else if (state == 2) // ex. [/*heh] state = 2; else if (state == 3 && c == '/') // ex. [/*heh*/] state = 0; else if (state == 3) // ex. [/*heh*e] state = 2; else if (state == 4 && c == '\\') // ex. [//hehe\] state = 9; else if (state == 9 && c == '\\') // ex. [//hehe\\\\\] state = 9; else if (state == 9) // ex. [//hehe\ or //hehe\a] state = 4; else if (state == 4 && c == '\n') // ex. [//hehe ] state = 0; else if (state == 0 && c == '\'') // ex. ['] state = 5; else if (state == 5 && c == '\\') // ex. ['\] state = 6; else if (state == 6) // ex. ['\n or '\' or '\t etc.] state = 5; else if (state == 5 && c == '\'') // ex. ['\n' or '\'' or '\t' ect.] state = 0; else if (state == 0 && c == '\"') // ex. ["] state = 7; else if (state == 7 && c == '\\') // ex. ["\] state = 8; else if (state == 8) // ex. ["\n or "\" or "\t ect.] state = 7; else if (state == 7 && c == '\"') // ex. ["\n" or "\"" or "\t" ect.] state = 0; //debug("c = %c, state = %d\n", c, state); if ((state == 0 && c != '/') || state == 5 || state == 6 || state == 7 || state == 8) putchar(c); }}
- 【1-23】编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。再c语言中,注释不允许嵌套。
- 编写一个删除C语言程序中所有注释语句,正确处理带引号的字符串与字符常量
- 练习1-23 编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量
- 编写一个删除C语言源程序中的所有注释语句,要正确处理带引号的字符串和字符常量。
- C程序设计语言练习1-23 编写一个删除C语言程序中所有的注释语句
- 编写一个删除C语言程序中所有注释语句的程序
- 编写一个删除c语言中的注释语句/* */的程序
- 编写一个程序,查找C语言中的基本语法错误,如圆括号、方括号、花括号不配对等,正确处理引号与注释
- 删除C语言程序中所有的注释语句,代码实现
- 删除C语言程序中所有的注释语句(有疑问)
- 用C语言编写一个去除C代码中所有的注释的部分
- 第7周 C语言程序设计(新2版) 练习1-23 删除C语言程序中所有的注释语句(代码有问题?)
- 编写一个C程序删除一个文件的所有注释
- 删除C语言程序中所以的注释语句(有疑问)
- 【C语言】编写一个程序统计输入字符串中: 各个数字、空白字符、以及其他所有字符出现的次数。
- C语言:编写一个程序统计输入字符串中,各个数字、空白字符、以及其他所有字符出现的次数。
- 删除c语言中的所有注释语句
- 【K&R 习题 1-23】删除C/C++语言中的程序中的所有注释语句
- 最后的作业:STINGY SAT问题
- hdu-3790
- Android-studio&Kotlin
- 20170715工作记账流水
- JS判断客户端类型(含微信)
- 【1-23】编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。再c语言中,注释不允许嵌套。
- PHPExcel入门(基于laravel 5.2)
- ImageCompress
- 斯坦福大学机器学习“神经网络的学习(Neural Networks: Learning)”
- maven工程-文件下载实现方式-超链接形式
- gcc命令与gdb命令常用选项
- https工作原理
- 十大经典排序算法
- azure 架构选择