删除c语言中的所有注释语句

来源:互联网 发布:阳春市12345网络问政 编辑:程序博客网 时间:2024/05/20 13:06


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

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

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. 编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。在C语言中,注释不允许嵌套。  

下面把代码贴出来:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2.   
  3. int state;  
  4.   
  5. int c1,c2;  
  6.   
  7. void change_state(int c);  
  8.   
  9. int main(int argc, const char * argv[]) {  
  10.     int c;  
  11.     state = 0;  
  12.     c1 = 0;  
  13.     c2 = 0;  
  14.     while ((c=getchar())!=EOF) {  
  15.         c1 = c2;  
  16.         c2 = c;  
  17.         change_state(c);  
  18.     }  
  19.     if (/* DISABLES CODE */ (0)==1) {  
  20.         printf("just test://abcd");  
  21.         printf("just test:/*hello*/");  
  22.     }  
  23. }  
  24.   
  25. /*状态机函数*/  
  26. void change_state(int c){  
  27.     if (state==0) {//普通状态  
  28.         if (c=='/') {  
  29.             state = 1;  
  30.         }else if (c=='"'){  
  31.             state = 5;  
  32.             putchar(c);  
  33.         }else if (c=='\''){  
  34.             state = 6;  
  35.             putchar(c);  
  36.         }  
  37.         else{  
  38.             state = 0;  
  39.             putchar(c);  
  40.         }  
  41.     }else if (state==1) {//检测到1个'/'  
  42.         if (c=='/') {  
  43.             state = 2;  
  44.         }else if (c=='*'){  
  45.             state = 3;  
  46.         }else{  
  47.             state = 0;  
  48.             putchar(c1);  
  49.             putchar(c);  
  50.         }  
  51.     }else if (state==2) {// "//"注释状态  
  52.         if (c=='\n') {  
  53.             state = 0;  
  54.             putchar(c);  
  55.         }else{  
  56.             state = 2;  
  57.         }  
  58.     }else if (state==3) {// "/*"注释状态  
  59.         if (c=='*') {  
  60.             state = 4;  
  61.         }else{  
  62.             state = 3;  
  63.         }  
  64.     }else if (state==4) {  
  65.         if (c=='/') {  
  66.             state = 0;  
  67.         }else{  
  68.             state = 3;  
  69.         }  
  70.     }else if (state==5){//在"字符串里  
  71.         if (c=='"') {  
  72.             state = 0;  
  73.             putchar(c);  
  74.         }else if(c=='\\'){  
  75.             state = 7;  
  76.             putchar(c);  
  77.         }else{  
  78.             state = 5;  
  79.             putchar(c);  
  80.         }  
  81.     }else if (state==6){//在'字符里  
  82.         if (c=='\'') {  
  83.             state = 0;  
  84.             putchar(c);  
  85.         }else if(c=='\\'){  
  86.             state = 8;  
  87.             putchar(c);  
  88.         }else{  
  89.             state = 6;  
  90.             putchar(c);  
  91.         }  
  92.     }else if (state==7){//在"字符串里的"\"  
  93.         state = 5;  
  94.         putchar(c);  
  95.     }else if (state==8){//在'字符串里的"\"  
  96.         state = 6;  
  97.         putchar(c);  
  98.     }  
  99. }  

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

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2.   
  3. int state;  
  4.   
  5. int c1,c2;  
  6.   
  7. void change_state(int c);  
  8.   
  9. int main(int argc, const char * argv[]) {  
  10.     int c;  
  11.     state = 0;  
  12.     c1 = 0;  
  13.     c2 = 0;  
  14.     while ((c=getchar())!=EOF) {  
  15.         c1 = c2;  
  16.         c2 = c;  
  17.         change_state(c);  
  18.     }  
  19.     if ( (0)==1) {  
  20.         printf("just test://abcd");  
  21.         printf("just test:/*hello*/");  
  22.     }  
  23. }  
  24.   
  25.   
  26. void change_state(int c){  
  27.     if (state==0) {  
  28.         if (c=='/') {  
  29.             state = 1;  
  30.         }else if (c=='"'){  
  31.             state = 5;  
  32.             putchar(c);  
  33.         }else if (c=='\''){  
  34.             state = 6;  
  35.             putchar(c);  
  36.         }  
  37.         else{  
  38.             state = 0;  
  39.             putchar(c);  
  40.         }  
  41.     }else if (state==1) {  
  42.         if (c=='/') {  
  43.             state = 2;  
  44.         }else if (c=='*'){  
  45.             state = 3;  
  46.         }else{  
  47.             state = 0;  
  48.             putchar(c1);  
  49.             putchar(c);  
  50.         }  
  51.     }else if (state==2) {  
  52.         if (c=='\n') {  
  53.             state = 0;  
  54.             putchar(c);  
  55.         }else{  
  56.             state = 2;  
  57.         }  
  58.     }else if (state==3) {  
  59.         if (c=='*') {  
  60.             state = 4;  
  61.         }else{  
  62.             state = 3;  
  63.         }  
  64.     }else if (state==4) {  
  65.         if (c=='/') {  
  66.             state = 0;  
  67.         }else{  
  68.             state = 3;  
  69.         }  
  70.     }else if (state==5){  
  71.         if (c=='"') {  
  72.             state = 0;  
  73.             putchar(c);  
  74.         }else if(c=='\\'){  
  75.             state = 7;  
  76.             putchar(c);  
  77.         }else{  
  78.             state = 5;  
  79.             putchar(c);  
  80.         }  
  81.     }else if (state==6){  
  82.         if (c=='\'') {  
  83.             state = 0;  
  84.             putchar(c);  
  85.         }else if(c=='\\'){  
  86.             state = 8;  
  87.             putchar(c);  
  88.         }else{  
  89.             state = 6;  
  90.             putchar(c);  
  91.         }  
  92.     }else if (state==7){  
  93.         state = 5;  
  94.         putchar(c);  
  95.     }else if (state==8){  
  96.         state = 6;  
  97.         putchar(c);  
  98.     }  
perfect!

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

0 0
原创粉丝点击