日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 刪除C語言程序中所有的注釋語句,代碼實現

刪除C語言程序中所有的注釋語句,代碼實現

來源:程序員人生   發布時間:2015-01-19 09:05:54 閱讀次數:2593次

原文鏈接: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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲视频在线一区二区 | 秋霞电影院午夜仑片 | 成人福利| 亚洲变态 | 午夜激情免费 | 欧美美女一区 | 国产日韩欧美视频 | 热久热久 | 一级aaa级毛片午夜在线播放 | 精品国产污污免费网站精东 | 国产精品美女久久久久久久网站 | 99久久er热在这里只有精品15 | 国产精品免费网站 | 日韩黄色一级毛片 | 日韩国产欧美在线观看 | 国产精品久久久久国产a级 亚洲天堂偷拍 | 九九亚洲精品 | 青青自拍视频 | 中文字幕av第一页 | 无码日韩精品一区二区免费 | 亚洲男人的天堂在线 | 99久久精品免费看国产四区 | 高清国产一区 | av不卡在线 | 黄色在线视频网站 | 精品一区久久久 | 日本99精品 | 亚洲精品久久久蜜桃 | 久久se精品一区精品二区 | 欧美第二页| 青草网 | 亚洲国产欧美在线 | 国产成人精品av | 中文字幕在线不卡视频 | 爱爱视频在线免费观看 | 亚洲精品国产视频 | 日韩久久久久久久 | 性一区| 国产高清一区二区三区 | 91久久精品视频 | 国产一区二区在线观看视频 |