OpenJudge-去除C程式中的註釋
阿新 • • 發佈:2018-11-19
-
OpenJudge-去除C程式中的註釋
-
題目連結:
-
思路:
註釋方式只有一種: /* ..... */ 且不能巢狀註釋
所以分三種情況:
1.當前字元不在註釋或字串中,如果不是註釋或字串標記符,直接輸出,否則改變狀態(註釋中/字串中)
2.字元在註釋中:檢查字元是否能構成 ” */ “ ,如果是,註釋狀態解除,否則註釋中的字元不輸出
3.字元在字串中:檢查字元是否為 ‘ ” ’ ,並且!!前面不得是 //” ,正常輸出
坑:
其實最坑是在字串中,涉及轉義字元 //,如果 ” 前有轉義字元,那麼該字元 ” 也是字串的一部分
-
程式碼:
#include<iostream> #include<string> #include<cstring> using namespace std; string Str, Str_Plus; int In_Str , In_Node ; int main() { while (getline(cin, Str)) Str_Plus += Str + '\n'; int Index = 0; while (Index != Str_Plus.size() - 1) { //不在註釋也不在字串中 while (!In_Node && !In_Str&&Index < Str_Plus.size() - 1) { //註釋開始符 if (Str_Plus[Index] == '/'&&Str_Plus[Index+1] == '*') { In_Node = 1; Index += 2; } //字串開始符 else if (Str_Plus[Index] != '\\'&&Str_Plus[Index + 1] == '"') //遇到轉義字元直接輸出就ok { In_Str = 1; cout << Str_Plus[Index] << Str_Plus[Index + 1]; Index += 2; } else cout << Str_Plus[Index++]; } //在字串中,要判斷結尾,如果雙引號前是 \\ 則不是結尾 while (In_Str&&Index < Str_Plus.size() - 1) { if (Str_Plus[Index] == '\\'&&Str_Plus[Index + 1] == '"') { cout << Str_Plus[Index] << Str_Plus[Index + 1]; Index += 2; } //真正結尾標誌 else if (Str_Plus[Index] == '"') { In_Str = 0; cout << Str_Plus[Index++]; } else cout << Str_Plus[Index++]; } //在註釋中,只遍歷不輸出直到註釋結束 while (In_Node&&Index < Str_Plus.size() - 1) { if (Str_Plus[Index] == '*'&&Str_Plus[Index + 1] == '/') { In_Node = 0; Index += 2; } else Index++; } } return 0; }