2016陕西省ACM省赛 HE 字符串处理 删除注释
HE
發布時間: 2017年3月27日 18:28?? 最后更新: 2017年3月27日 18:30?? 時間限制: 1000ms?? 內存限制: 256M
描述"Hi there, my name is HE."
在某個秘密的計算機實驗室中,超級人工智能計算機 HE 誕生了。
HE 可以在網絡中搜索合適的程序代碼進行自我升級。在某次升級的過程中,HE 得到了一堆軟件代碼,其中有很多注釋和空行。注釋是為了人類能夠讀懂代碼而寫的,而對于 HE 來說,它并不需要這些東西,因此它會首先刪除掉代碼中的所有注釋以及空行。
這里定義了2種注釋格式:
1.行注釋“//”:符號“//”之后直至行尾的所有內容都被認為是注釋部分;
2.段注釋“/\* ... \*/”:“/\*”表示段注釋開始,“\*/”表示段注釋結束,其間的所有內容都被認為是注釋部分。
科學家發現 HE 的編譯器分析部分出現了一些小問題,現在他們希望你能夠編寫程序幫助 HE 完成這一步驟。
輸入輸入文件只有一個,其中有許多包含注釋的語言代碼,請讀至文件末尾(EOF)。
輸出 輸出刪除掉注釋之后的代碼。
注:
1.若某一行刪除完注釋之后只剩下空格,則該行也將被視作一個空行,需要一起刪除。
2.需要同時刪除行末的空格。
step1()函數用于去除// 以及/**/這類的注釋,把要刪除的地方標記為1,輸出的時候不輸出就可以了
step2()函數用于去除多余的空格以及換行。
思路如下:
每次從一行的開頭檢測,直到檢測到'\n'為止,用pre表示該行第一個空格的位置,如果這一行中有非空格字符,那么標志位f = 1
該行檢測完成以后把beg 到 \n區間全部刪除掉(置值為1),然后判斷f是否為1,如果不為1,那么\n也要刪除掉
#include <cstdio> #include <iostream> using namespace std; char str[1000000]; int length; void read() {char c;while(~scanf("%c",&c))str[length++] = c;str[length++] = '\n';str[length] = 0; } void step1() {char c = str[0];int pos = 0;while(c){if(c == '/'){if(str[pos + 1] == '/')while(str[pos] != '\n') str[pos++] = 1;else if(str[pos + 1] == '*'){while(str[pos + 2] != '*' || str[pos + 3] != '/') str[pos++] = 1; str[pos] = str[pos + 1] = str[pos + 2] = str[pos + 3] = 1;}}c = str[++pos];} } void step2() {char c = str[0];int pos = 0;while(true){if(pos == length) break;int f = 0;int beg = pos;//本行第一個字符 for(;str[pos] != '\n';pos++){if(str[pos] == 1) continue;//已經被刪除過的字符不必考慮在內 if(str[pos] != ' ') {beg = pos + 1;f = 1;}}//pos 指向/nfor(int i = beg;i < pos;i++) str[i] = 1; if(!f) str[pos] = 1;pos ++;}str[length-1] = 1; } void print() {int pos = 0;while(str[pos]){if(str[pos] != 1) putchar(str[pos]);pos++;} } int main() {freopen("test.txt","r",stdin);freopen("out.txt","w",stdout);read();step1();step2();print(); }
總結
以上是生活随笔為你收集整理的2016陕西省ACM省赛 HE 字符串处理 删除注释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果4铃声怎么设置 5步轻松设置铃声
- 下一篇: 赵文卓电影 赵文卓主演过的电影