Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++를 사용하여 문자열에서 주석 제거

<시간/>

입력으로 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;
}