Cho mã nguồn C++ dưới dạng vector//) và chú thích khối (/* ... */). Dòng rỗng sau khi xóa không được giữ lại. Ví dụ:
Đầu vào: vector chứa các dòng có chú thích dòng và khối.
Đầu ra: vector chỉ chứa code thực thi, không chú thích, bỏ dòng rỗng.
Phương pháp: Duyệt từng ký tự, quản lý trạng thái
- Biến
inBlockđánh dấu đang trong chú thích khối. - Duyệt từng dòng, từng ký tự:
- Nếu không trong khối và gặp
//→ bỏ qua phần còn lại của dòng. - Nếu không trong khối và gặp
/*→ đặtinBlock = true, bỏ qua 2 ký tự. - Nếu trong khối và gặp
*/→ đặtinBlock = false, bỏ qua 2 ký tự. - Nếu không trong khối → thêm ký tự vào buffer dòng hiện tại.
- Nếu không trong khối và gặp
- Kết thúc dòng: nếu không trong khối và buffer không rỗng → thêm vào kết quả, xóa buffer.
Ví dụ mã nguồn
#include <bits/stdc++.h>
using namespace std;
vector<string> removeComments(vector<string> &source) {
vector<string> ans;
string line;
bool inBlock = false;
for (auto &s : source) {
for (int i = 0; i < s.size(); i++) {
if (!inBlock && i+1 < s.size() && s[i]=='/' && s[i+1]=='/') break;
else if (!inBlock && i+1 < s.size() && s[i]=='/' && s[i+1]=='*') { inBlock = true; i++; }
else if (inBlock && i+1 < s.size() && s[i]=='*' && s[i+1]=='/') { inBlock = false; i++; }
else if (!inBlock) line.push_back(s[i]);
}
if (!inBlock && !line.empty()) {
ans.push_back(line);
line.clear();
}
}
return ans;
}
int main() {
vector<string> source = {
"/*Test program */", "int main()", "{ ",
" // variable declaration ", "int a, b, c;",
"/* This is a test", " multiline ", " comment for ", " testing */",
"a = b + c;", "}"
};
vector<string> res = removeComments(source);
for (auto &x : res) cout << x << '\n';
return 0;
}
Kết quả
int main()
{
int a, b, c;
a = b + c;
}