国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

去除C/C++中的注釋

2019-11-06 07:53:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
/******************************************************** 功能: 輸入:指向C/C++程序代碼的指針及長(zhǎng)度 來(lái)源:程序員面試寶典第45頁(yè)

分析:一次讀取一行,分兩種情況,因?yàn)橛袃煞N注釋:

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

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

(3)進(jìn)行步驟1、步驟2,直到程序結(jié)束。

編程時(shí)要考慮的特殊情況i:

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

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

“//”與“/*”的嵌套關(guān)系,比如///* 、/*  //*/ *********************************************************/

#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-動(dòng)態(tài)移動(dòng)的字符指針,end-指向文件末尾的字符指針,c-存儲(chǔ)沒一個(gè)p指向的字符 char *sq_start, *dq_start;   //sq_start-單引號(hào)開始位置(single),dq_start-雙引號(hào)開始(double) char *lc_start, *bc_start;    //lc_start-//的開始位置,bc_start-/*的開始位置 size_t len;                         //記錄某符號(hào)結(jié)束和開始的位置之差(長(zhǎng)度,偏移量)  p = buf; end = p + size; sq_start = dq_start = NULL; lc_start = bc_start = NULL;  while (p < end)      /*當(dāng)指針沒有到達(dá)文件末尾 */ {  c = *p;                //用字符變量c存儲(chǔ)指針指向的字符    switch (c)             //根據(jù)c的值做相應(yīng)處理  {   case '/'':              /*處理單引號(hào)*/   {    if (dq_start || lc_start || bc_start)          //當(dāng)遇到過(guò)雙引號(hào)、//或/*的時(shí)候,則不需要再判斷'//'的情況了。    {     p++;     continue;                          //繼續(xù)下一個(gè),對(duì)while而言的    }    /*******************************以下是沒有遇到過(guò)雙引號(hào)或//或/*的時(shí)候*******************************/    if (sq_start == NULL)     /****如果未遇到單引號(hào)****/    {     sq_start = p++;            //start指向單引號(hào)的開始位置,p指向下一個(gè)</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                              /*如果遇到過(guò)單引號(hào),sq_start指向單引號(hào)開始位置*/    {     len = (p++) -sq_start;        if (len == 2 && *(sq_start+1) == '//'){     /*若遇到 “  '/''   ”這種情況則兩個(gè)單引號(hào)并未匹配,遇到的“'”是“/' ”中的,而不是與sq_start所指向單引號(hào)匹配*/      continue;     }          sq_start = NULL;      //否則將sq_start置位為NULL        }    /*******************************以上是沒有遇到過(guò)雙引號(hào)或//或/*的時(shí)候*******************************/    break;   }      case '/"':                   /*處理雙引號(hào)*/   {    if (sq_start || lc_start || bc_start)              //當(dāng)遇到過(guò)單引號(hào)、//或/*的時(shí)候,則不需要處理    {     p++;     continue;    }    /*****************以下是沒有遇到過(guò)單引號(hào)或//或/*的時(shí)候*****************/    if (dq_start == NULL)        /*如果沒有遇到過(guò)雙引號(hào)*/    {     dq_start = p++;              //標(biāo)記遇到了雙引號(hào)    }    else if (*((p++) -1) =='//')     /*若遇到 “" ab/''cd"   ”這種情況則兩個(gè)雙引號(hào)并未匹配,遇到的“"”是“/"”中的,而不是與dq_start所指向雙引號(hào)匹配*/     continue;    }    dq_start = NULL;                 //如果雙引號(hào)中不是//,標(biāo)記為NULL    /*****************以上是沒有遇到過(guò)單引號(hào)或//或/*的時(shí)候*****************/   }      case '/':            //斜杠,注意這個(gè)斜杠也可以是'//',"//",//,/*/中的第二個(gè)斜杠,但會(huì)在下面第二行代碼中被忽略掉   {    if (sq_start || dq_start || lc_start || bc_start) //如果是單引號(hào)、雙引號(hào)、斜杠、/*的后面    {     p++;     continue;    }    /***********************下面是遇到注釋//或/*的時(shí)候****************************/    c = *(p + 1);         //否則c取p指向字符的下一個(gè)字符    if (c == '/')            //遇到了雙斜杠    {     lc_start = p;         //標(biāo)記雙斜杠的開始     p += 2;                //p指向雙斜杠后面的字符    }    else if (c == '*')     //遇到了/*    {     bc_start = p;       //標(biāo)記/*的開始     p += 2;              //p指向/*后面的字符    }    /*************************上面是遇到注釋//或/*的時(shí)候**************************/    else    {     p++;     }   }      case '*': //星號(hào),同斜杠,但少了如果遇到/*的情況,因?yàn)橛龅竭@種情況后,要判斷是不是遇到結(jié)束的地方*/了   {    if (sq_start || dq_start || lc_start) //如果是單引號(hào)、雙引號(hào)、斜杠、/*的后面    {     p++;     continue;     }        if (*(p + 1) != '/') //如果星號(hào)后面緊跟的不是斜杠,那么忽略過(guò)。    {     p++;     continue;    }        p += 2; //否則p指向斜杠后面那個(gè)字符。注意下面的清空語(yǔ)句,p指向的那個(gè)字符并不會(huì)被清除。    memset(bc_start, ' ', p-bc_start); //清空/* …… */中間的內(nèi)容包括注釋符號(hào)本身。    bc_start = NULL;    break;   }      case '/n': /*換行符,主要處理遇到雙斜杠時(shí),需要清除雙斜杠到/n的前面的字符*/   {    if (lc_start == NULL) //如果還沒有遇到雙斜杠,那么忽略    {     p++;     continue;     }        c = *(p - 1);    /*如果遇到過(guò)雙斜杠,清空雙斜杠本身和到/n前面的那個(gè)字符,p指向下一個(gè)字符,/r是回車符(光標(biāo)退回到最前面),這里要判斷</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'是因?yàn)樵赨NIX系統(tǒng)下文件結(jié)尾的換行只有/n,而windows系統(tǒng)下文件結(jié)尾的換行為/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;  }  /****************************************************  如果遇到雙斜杠,這個(gè)if語(yǔ)句存在的意義在于萬(wàn)一最后  一行代碼是帶有雙斜杠但沒有給換行符/n的,也要清除掉。    *****************************************************/  if (lc_start)   {   memset(lc_start, ' ', p - lc_start);  } }}/**********************************************   main函數(shù)的開始***********************************************/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;}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 唐河县| 醴陵市| 曲麻莱县| 宿松县| 日土县| 会宁县| 洛南县| 吴忠市| 太保市| 三原县| 中方县| 宣武区| 华池县| 宁阳县| 温宿县| 万盛区| 长治市| 上蔡县| 中西区| 连山| 房山区| SHOW| 通河县| 集贤县| 黎城县| 吉木萨尔县| 昌邑市| 长宁区| 迁安市| 蒲城县| 建宁县| 博客| 河南省| 两当县| 舒兰市| 封丘县| 凤山县| 湘潭市| 法库县| SHOW| 儋州市|