亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

去除C/C++中的注釋

2019-11-06 07:53:32
字體:
來源:轉載
供稿:網友
/******************************************************** 功能: 輸入:指向C/C++程序代碼的指針及長度 來源:程序員面試寶典第45頁

分析:一次讀取一行,分兩種情況,因為有兩種注釋:

(1)在讀取到的一行中查找“//”,如果找到,則把“//”及其后的部分扔掉。

(2)在讀取到的一行中查找“/*”,記錄位置pos1,然后再在這行中查找“*/”,如果找到,也記錄位置pos2,扔掉它們與其中的內容,以pos2開始,繼續查找“/*”;如果在當前行中沒有找到,則去掉當前行中“/*”及其后的內容,讀取新的一行,查找“*/”,如沒有。則去掉讀取到的這一行,再讀一行,查找“*/”,如找到,記錄位置pos2,去掉這一行的0到pos2之間的字符。

(3)進行步驟1、步驟2,直到程序結束。

編程時要考慮的特殊情況i:

“”中的“//”“/*”

''中的“//”“/*”

“//”與“/*”的嵌套關系,比如///* 、/*  //*/ *********************************************************/

#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <string.h>#include <unistd.h>#include <sys/types.h>void remove_comment(char *buf, size_t size){ char *p, *end, c;                //p-動態移動的字符指針,end-指向文件末尾的字符指針,c-存儲沒一個p指向的字符 char *sq_start, *dq_start;   //sq_start-單引號開始位置(single),dq_start-雙引號開始(double) char *lc_start, *bc_start;    //lc_start-//的開始位置,bc_start-/*的開始位置 size_t len;                         //記錄某符號結束和開始的位置之差(長度,偏移量)  p = buf; end = p + size; sq_start = dq_start = NULL; lc_start = bc_start = NULL;  while (p < end)      /*當指針沒有到達文件末尾 */ {  c = *p;                //用字符變量c存儲指針指向的字符    switch (c)             //根據c的值做相應處理  {   case '/'':              /*處理單引號*/   {    if (dq_start || lc_start || bc_start)          //當遇到過雙引號、//或/*的時候,則不需要再判斷'//'的情況了。    {     p++;     continue;                          //繼續下一個,對while而言的    }    /*******************************以下是沒有遇到過雙引號或//或/*的時候*******************************/    if (sq_start == NULL)     /****如果未遇到單引號****/    {     sq_start = p++;            //start指向單引號的開始位置,p指向下一個</p><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; color:rgb(51,51,51); font-family:tahoma,arial,宋體,sans-serif; font-size:15px; line-height:18px">    }    else                              /*如果遇到過單引號,sq_start指向單引號開始位置*/    {     len = (p++) -sq_start;        if (len == 2 && *(sq_start+1) == '//'){     /*若遇到 “  '/''   ”這種情況則兩個單引號并未匹配,遇到的“'”是“/' ”中的,而不是與sq_start所指向單引號匹配*/      continue;     }          sq_start = NULL;      //否則將sq_start置位為NULL        }    /*******************************以上是沒有遇到過雙引號或//或/*的時候*******************************/    break;   }      case '/"':                   /*處理雙引號*/   {    if (sq_start || lc_start || bc_start)              //當遇到過單引號、//或/*的時候,則不需要處理    {     p++;     continue;    }    /*****************以下是沒有遇到過單引號或//或/*的時候*****************/    if (dq_start == NULL)        /*如果沒有遇到過雙引號*/    {     dq_start = p++;              //標記遇到了雙引號    }    else if (*((p++) -1) =='//')     /*若遇到 “" ab/''cd"   ”這種情況則兩個雙引號并未匹配,遇到的“"”是“/"”中的,而不是與dq_start所指向雙引號匹配*/     continue;    }    dq_start = NULL;                 //如果雙引號中不是//,標記為NULL    /*****************以上是沒有遇到過單引號或//或/*的時候*****************/   }      case '/':            //斜杠,注意這個斜杠也可以是'//',"//",//,/*/中的第二個斜杠,但會在下面第二行代碼中被忽略掉   {    if (sq_start || dq_start || lc_start || bc_start) //如果是單引號、雙引號、斜杠、/*的后面    {     p++;     continue;    }    /***********************下面是遇到注釋//或/*的時候****************************/    c = *(p + 1);         //否則c取p指向字符的下一個字符    if (c == '/')            //遇到了雙斜杠    {     lc_start = p;         //標記雙斜杠的開始     p += 2;                //p指向雙斜杠后面的字符    }    else if (c == '*')     //遇到了/*    {     bc_start = p;       //標記/*的開始     p += 2;              //p指向/*后面的字符    }    /*************************上面是遇到注釋//或/*的時候**************************/    else    {     p++;     }   }      case '*': //星號,同斜杠,但少了如果遇到/*的情況,因為遇到這種情況后,要判斷是不是遇到結束的地方*/了   {    if (sq_start || dq_start || lc_start) //如果是單引號、雙引號、斜杠、/*的后面    {     p++;     continue;     }        if (*(p + 1) != '/') //如果星號后面緊跟的不是斜杠,那么忽略過。    {     p++;     continue;    }        p += 2; //否則p指向斜杠后面那個字符。注意下面的清空語句,p指向的那個字符并不會被清除。    memset(bc_start, ' ', p-bc_start); //清空/* …… */中間的內容包括注釋符號本身。    bc_start = NULL;    break;   }      case '/n': /*換行符,主要處理遇到雙斜杠時,需要清除雙斜杠到/n的前面的字符*/   {    if (lc_start == NULL) //如果還沒有遇到雙斜杠,那么忽略    {     p++;     continue;     }        c = *(p - 1);    /*如果遇到過雙斜杠,清空雙斜杠本身和到/n前面的那個字符,p指向下一個字符,/r是回車符(光標退回到最前面),這里要判斷</p><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; color:rgb(51,51,51); font-family:tahoma,arial,宋體,sans-serif; font-size:15px; line-height:18px">   c == '/r'是因為在UNIX系統下文件結尾的換行只有/n,而windows系統下文件結尾的換行為/r/n   */</p><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; color:rgb(51,51,51); font-family:tahoma,arial,宋體,sans-serif; font-size:15px; line-height:18px">    memset(lc_start, ' ', (c == '/r'? ((p++) -1) : p++) - lc_start);     lc_start = NULL;    break;   }      default:    p++;    break;  }  /****************************************************  如果遇到雙斜杠,這個if語句存在的意義在于萬一最后  一行代碼是帶有雙斜杠但沒有給換行符/n的,也要清除掉。    *****************************************************/  if (lc_start)   {   memset(lc_start, ' ', p - lc_start);  } }}/**********************************************   main函數的開始***********************************************/int main (int argc, char *argv[]){ int fd, n; char buf[102400];  if (argc != 2) {  PRintf("command error: Input as ./command <file>/n"); }  fd = open(argv[1], O_RDONLY); /*只讀打開*/ if (fd == -1) {  return -1; }  n = read(fd, buf, sizeof(buf)); if (n == -1 || n == 0) {  close(fd);  return -1; } printf("test/n"); remove_comment(buf, n); *(buf + n) = '/0'; printf("%s", buf); close(fd);  return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本亚洲欧美成人| 这里只有精品视频在线| 68精品国产免费久久久久久婷婷| 92福利视频午夜1000合集在线观看| 久久精品国产免费观看| 欧美精品激情blacked18| 国产欧美一区二区白浆黑人| 日韩中文字幕免费视频| 亚洲午夜未满十八勿入免费观看全集| 国产丝袜一区二区三区| 国产免费亚洲高清| 成人免费视频网| 日本精品视频在线| 日韩欧美亚洲一二三区| 日韩高清a**址| 久久人人爽亚洲精品天堂| 国产欧美日韩专区发布| 欧美国产日韩在线| 日韩精品视频免费在线观看| 国产日韩一区在线| 亚洲bt欧美bt日本bt| 九九热精品视频在线播放| 色噜噜亚洲精品中文字幕| 日韩激情av在线免费观看| 久久久国产精品x99av| 欧美视频在线免费看| 国产精品视频播放| 久久精品视频网站| 亚州精品天堂中文字幕| 日韩中文在线中文网在线观看| 中文字幕亚洲欧美日韩在线不卡| 狠狠综合久久av一区二区小说| 亚洲精品综合精品自拍| 亚洲黄色成人网| 亚洲国产精品美女| 91久久综合亚洲鲁鲁五月天| 欧美激情国产高清| 91在线免费视频| 亚洲国产精品字幕| 91免费精品视频| 欧美色视频日本高清在线观看| 午夜剧场成人观在线视频免费观看| 亚洲级视频在线观看免费1级| 亚洲区免费影片| 久操成人在线视频| 97视频在线看| 裸体女人亚洲精品一区| 亚洲精品一区av在线播放| 久久高清视频免费| 久久久亚洲影院| 91高潮精品免费porn| 久久精品国产99国产精品澳门| 久久电影一区二区| 国产美女久久久| 在线日韩精品视频| 亚洲男女自偷自拍图片另类| 亚洲第一国产精品| 欧美激情视频在线免费观看 欧美视频免费一| 日韩电影中文字幕一区| 亚洲日本中文字幕免费在线不卡| 国产成人高清激情视频在线观看| 国产性猛交xxxx免费看久久| 国产日韩av在线| 亚洲欧美成人精品| 奇米4444一区二区三区| 国产在线视频不卡| 欧美激情videos| 九九热最新视频//这里只有精品| 久久久久女教师免费一区| 国内精品小视频在线观看| 欧美国产日韩一区二区在线观看| 久久99久国产精品黄毛片入口| 亚洲精品国偷自产在线99热| 97视频在线观看成人| 91精品久久久久久久久久久| 一区二区欧美激情| 亚洲白拍色综合图区| 日韩av不卡在线| 亚洲精品美女免费| 97**国产露脸精品国产| 精品久久久久久久久中文字幕| 国产第一区电影| 国产成人精品日本亚洲专区61| 性视频1819p久久| 中文字幕视频在线免费欧美日韩综合在线看| 国产偷亚洲偷欧美偷精品| 最近2019中文字幕大全第二页| 91国内免费在线视频| 国产综合久久久久久| 日本久久久久亚洲中字幕| 成人精品一区二区三区| 久久福利视频导航| 久久久久久国产精品久久| 久久久久久久久久久免费| 亚洲欧美激情另类校园| 国产精品久久久91| 69av成年福利视频| 一区二区国产精品视频| 国产一区二区三区18| 一区二区三区精品99久久| 成人黄色片在线| 国产中文字幕亚洲| 亚洲精品久久7777777| 亚洲精品成人久久电影| 美女少妇精品视频| 欧美第一黄网免费网站| 中文字幕亚洲综合久久| 一本久久综合亚洲鲁鲁| 91成人福利在线| 欧美日产国产成人免费图片| 狠狠躁夜夜躁久久躁别揉| 丰满岳妇乱一区二区三区| 国产色婷婷国产综合在线理论片a| 午夜精品一区二区三区av| 51色欧美片视频在线观看| 免费91在线视频| 亚洲欧美日韩高清| 亚洲欧美国产精品| 久久中文字幕在线| 26uuu日韩精品一区二区| 91视频-88av| 国产一区二区三区久久精品| 久久久精品一区二区| 国产欧美一区二区三区久久人妖| 欧美午夜精品伦理| 国产在线精品成人一区二区三区| 亚洲欧美在线免费| 国模吧一区二区三区| 亚洲欧洲午夜一线一品| 久久亚洲国产精品| 亚洲人成网站999久久久综合| 91精品久久久久久久久青青| 欧美日韩国产中字| 欧美激情在线有限公司| 色综合久久久888| 欧美日韩国产成人在线观看| 国产精品亚洲精品| 国产精品高清免费在线观看| 欧美香蕉大胸在线视频观看| 亚洲午夜未满十八勿入免费观看全集| 欧美国产精品人人做人人爱| 92国产精品视频| 欧美黄色片在线观看| 精品国产户外野外| 亚洲成人久久久| 亚洲黄一区二区| 欧美日韩国产丝袜另类| 亚洲成人久久电影| 欧美黑人一区二区三区| 夜色77av精品影院| 欧美大片在线看| 精品香蕉在线观看视频一| 亚洲一区二区三区毛片| 91精品国产高清久久久久久91| 国产主播喷水一区二区| 国产欧美一区二区三区四区| 日韩av网站大全| 日韩视频免费大全中文字幕| 国产一区av在线| 国产91精品最新在线播放| 欧美日韩国产区| 国产精品综合网站| 国产成人综合精品在线| 国内外成人免费激情在线视频网站|