입력으로 C++ 프로그램이 주어지면 주석을 제거하십시오. 'source'는 소스 코드의 i번째 줄이 소스[i]인 벡터입니다. 이것은 개행 문자 \n으로 소스 코드 문자열을 분할한 결과를 나타냅니다. C++에서는 라인 주석, 블록 주석의 두 가지 유형의 주석을 작성할 수 있습니다.
문자열 '\\'는 줄 주석을 나타냅니다. 즉, 오른쪽 옆에 있는 문자열은 프로그램에서 무시됩니다.
문자열 '\* 및 *\'는 '\*에서 시작하여 *\'가 무시될 때까지 문자열을 나타내는 여러 줄 주석입니다.
첫 번째 유용한 주석이 다른 주석보다 우선합니다. // 문자열이 블록 주석에 있으면 무시됩니다. 마찬가지로 /* 문자열이 줄이나 블록 주석에 나타나면 무시됩니다. 주석을 제거한 후 코드의 특정 줄이 비어 있는 경우 해당 줄을 출력해서는 안 됩니다. 답변 목록의 각 문자열은 비어 있지 않습니다.
예를 들어 -
입력-1 -
source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"] The line by line code is as follows: /*Test program */ int main(){ // variable declaration int a, b, c; /* This is a test multiline comment for testing */ a = b + c; }
출력 -
["int main()","{ "," ","int a, b, c;","a = b + c;","}"]The line by line code is as follows: int main() /// Main Function { int a, b, c; a = b + c; }
설명 − 문자열 /*는 1행과 6-9행을 포함하는 여러 줄 주석을 의미합니다. // 문자열은 4행을 주석으로 나타냅니다.
이 문제를 해결하기 위한 접근 방식
-
이상적인 컴파일러가 하는 것처럼 문자열을 한 줄씩 구문 분석합니다. // 또는 '/* /*'를 만나면 이 블록 따옴표 사이와 뒤에 있는 모든 문자를 무시합니다.
-
removeString(vector
&source) 함수는 소스 코드를 입력으로 받아 주석을 제거한 후 코드를 반환합니다. -
Boolean 변수 주석은 false로 초기화되어 특정 문자열 또는 문자 블록이 주석인지 여부를 확인합니다.
-
블록 주석을 시작하고 블록 안에 있지 않으면 다음 두 문자를 건너뛰고 특정 블록에서 상태를 변경합니다.
-
블록 주석을 종료하고 블록 안에 있으면 다음 두 문자를 건너뛰고 상태를 블록이 아닌 것으로 변경합니다.
-
줄 주석을 시작하고 블록에 없으면 줄의 나머지 부분을 무시합니다.
-
블록 댓글이 아닌 경우(댓글의 시작 부분이 아닌 경우) 현재 있는 문자를 기록합니다.
-
각 라인의 끝에서 블록에 있지 않은 경우 해당 라인을 기록합니다.
-
알고리즘은 O(소스) 시간 복잡도에서 실행됩니다. 소스는 입력 문자열입니다.
예
#include<bits/stdc++.h> using namespace std; vector<string>removeComments(vector<string>&source){ vector<string>ans; string s; bool comment= false; for(int i = 0; i < source.size(); i++) { for(int j = 0; j < source[i].size(); j++) { if(!comment && j + 1 < source[i].size() && source[i][j] == '/' && source[i][j+1]=='/') break; else if(!comment && j + 1 < source[i].size() && source[i][j] == '/' && source[i][j+1]=='*') comment = true; j++; else if(comment && j + 1 < source[i].size() && source[i][j] == '*' && source[i][j+1]=='/') comment = false; j++; else if(!comment) s.push_back(source[i][j]); } if(!comment && s.size()) ans.push_back(s), s.clear(); } return ans; } int main(){ vector<string>source (“ source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"] The formatted code can be interpreted as - /*Test program */ int main() // Main function{ int a, b, c; // variable declaration /* This is a test multiline comment for testing */ a = b + c; }”); vector<string>res= removeComments(source); for(auto x:res){ cout<<x; } return 0; }
출력
["int main()","{ "," ","int a, b, c;","a = b + c;","}"]The line by line code is visualized as below: int main(){ int a, b, c; a = b + c; }