删除C语言程序中所有的注释语句,代码实现

原文链接:http://lixing123.com/archives/310

学习《C程序设计语言》到第1章最后,有1道题目:

编写1个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。在C语言中,注释不允许嵌套。
Exercise 1⑵3. Write a program to remove all comments from a C program. Don't forget to handle quoted strings and character constants properly. C comments don't nest.

刚开始,我用1种brute-force的方式,对每一个字符进行遍历,然落后行判断,有无进入注释。

这样做有1个非常麻烦的问题:只有连续检测到“//”或"/*"时,才肯定进入了注释状态;如果我们只检测到1个"/",后面就是其它字符串的话,还得将这个单独的"/"打印出来。

而且有许多的分支状态,如果用if/else的话,会难以理解,并容易出错。

在网上搜了1下,发现有1种解法非常好:状态机。在各种状态之间跳转,逻辑清晰,不容易出错,出错了也容易调试。

下面把代码贴出来:

#include <stdio.h>

int state;

int c1,c2;

void change_state(int c);

int main(int argc, const char * argv[]) {
int c;
state = 0;
c1 = 0;
c2 = 0;
while ((c=getchar())!=EOF) {
c1 = c2;
c2 = c;
change_state(c);
}
if (/* DISABLES CODE */ (0)==1) {
printf("just test://abcd");
printf("just test:/*hello*/");
}
}

/*状态机函数*/
void change_state(int c){
if (state==0) {//普通状态
if (c=='/') {
state = 1;
}else if (c=='"'){
state = 5;
putchar(c);
}else if (c=='''){
state = 6;
putchar(c);
}
else{
state = 0;
putchar(c);
}
}else if (state==1) {//检测到1个'/'
if (c=='/') {
state = 2;
}else if (c=='*'){
state = 3;
}else{
state = 0;
putchar(c1);
putchar(c);
}
}else if (state==2) {// "//"注释状态
if (c=='
') {
state = 0;
putchar(c);
}else{
state = 2;
}
}else if (state==3) {// "/*"注释状态
if (c=='*') {
state = 4;
}else{
state = 3;
}
}else if (state==4) {
if (c=='/') {
state = 0;
}else{
state = 3;
}
}else if (state==5){//在"字符串里
if (c=='"') {
state = 0;
putchar(c);
}else if(c==''){
state = 7;
putchar(c);
}else{
state = 5;
putchar(c);
}
}else if (state==6){//在'字符里
if (c==''') {
state = 0;
putchar(c);
}else if(c==''){
state = 8;
putchar(c);
}else{
state = 6;
putchar(c);
}
}else if (state==7){//在"字符串里的""
state = 5;
putchar(c);
}else if (state==8){//在'字符串里的""
state = 6;
putchar(c);
}
}

以本段代码作为输入,结果以下:

#include <stdio.h>

int state;

int c1,c2;

void change_state(int c);

int main(int argc, const char * argv[]) {
int c;
state = 0;
c1 = 0;
c2 = 0;
while ((c=getchar())!=EOF) {
c1 = c2;
c2 = c;
change_state(c);
}
if ( (0)==1) {
printf("just test://abcd");
printf("just test:/*hello*/");
}
}

void change_state(int c){
if (state==0) {
if (c=='/') {
state = 1;
}else if (c=='"'){
state = 5;
putchar(c);
}else if (c=='''){
state = 6;
putchar(c);
}
else{
state = 0;
putchar(c);
}
}else if (state==1) {
if (c=='/') {
state = 2;
}else if (c=='*'){
state = 3;
}else{
state = 0;
putchar(c1);
putchar(c);
}
}else if (state==2) {
if (c=='
') {
state = 0;
putchar(c);
}else{
state = 2;
}
}else if (state==3) {
if (c=='*') {
state = 4;
}else{
state = 3;
}
}else if (state==4) {
if (c=='/') {
state = 0;
}else{
state = 3;
}
}else if (state==5){
if (c=='"') {
state = 0;
putchar(c);
}else if(c==''){
state = 7;
putchar(c);
}else{
state = 5;
putchar(c);
}
}else if (state==6){
if (c==''') {
state = 0;
putchar(c);
}else if(c==''){
state = 8;
putchar(c);
}else{
state = 6;
putchar(c);
}
}else if (state==7){
state = 5;
putchar(c);
}else if (state==8){
state = 6;
putchar(c);
}

perfect!

感谢@roma823 及其文章:http://blog.csdn.net/roma823/article/details/6364849

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » 删除C语言程序中所有的注释语句,代码实现

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡