Computer >> Máy Tính >  >> Lập trình >> C ++

Xóa nhận xét trong một chuỗi bằng C ++

Cho một chương trình C ++ làm đầu vào, hãy xóa các nhận xét khỏi nó. ‘Source’ là một vectơ trong đó dòng thứ i của mã nguồn là nguồn [i]. Điều này thể hiện kết quả của việc tách chuỗi mã nguồn theo ký tự dòng mới \ n. Trong C ++, chúng ta có thể tạo hai loại nhận xét, tức là Nhận xét dòng, Nhận xét khối.

Chuỗi ‘\\’ biểu thị chú thích dòng, có nghĩa là chuỗi bên cạnh nó ở bên phải sẽ bị chương trình bỏ qua.

Chuỗi ‘\ * và * \’ là một nhận xét nhiều dòng đại diện cho chuỗi bắt đầu từ ‘\ * cho đến khi * \’ sẽ bị bỏ qua.

Nhận xét hữu ích đầu tiên được ưu tiên hơn các nhận xét khác:nếu chuỗi // xuất hiện trong một nhận xét khối, nó sẽ bị bỏ qua. Tương tự, nếu chuỗi / * xuất hiện trong một dòng hoặc một khối chú thích, nó cũng bị bỏ qua. Nếu một dòng mã nào đó trống sau khi xóa nhận xét, bạn không được xuất dòng đó - mỗi chuỗi trong danh sách câu trả lời sẽ không trống.

Ví dụ -

Đầu vào-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;
}

Đầu ra -

["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;
}

Giải thích - Chuỗi / * có nghĩa là một nhận xét nhiều dòng, bao gồm dòng 1 và dòng 6-9. Chuỗi // biểu thị dòng 4 là nhận xét.

Phương pháp tiếp cận để giải quyết vấn đề này

  • Chúng tôi sẽ phân tích cú pháp chuỗi từng dòng như một trình biên dịch lý tưởng. Chúng tôi sẽ bỏ qua tất cả các ký tự giữa và sau các dấu ngoặc kép này khi chúng tôi gặp // hoặc ‘/ * / *.’

  • Hàm removeString (vector &source) lấy mã nguồn làm đầu vào và trả về mã sau khi xóa nhận xét của nó.

  • Một nhận xét biến Boolean được khởi tạo là false, sẽ kiểm tra xem khối chuỗi hoặc ký tự cụ thể có phải là một nhận xét hay không.

  • Nếu chúng tôi bắt đầu một nhận xét khối và chúng tôi không ở trong một khối, thì chúng tôi sẽ bỏ qua hai ký tự tiếp theo và thay đổi trạng thái của chúng tôi trong khối cụ thể đó.

  • Nếu chúng tôi kết thúc một nhận xét khối và chúng tôi đang ở trong một khối, chúng tôi sẽ bỏ qua hai ký tự tiếp theo và thay đổi trạng thái của chúng tôi để không ở trong một khối.

  • Nếu chúng tôi bắt đầu một nhận xét dòng và không ở trong một khối, chúng tôi sẽ bỏ qua phần còn lại của dòng.

  • Nếu chúng tôi không ở trong một khối nhận xét (và đó không phải là phần bắt đầu của một nhận xét), chúng tôi sẽ ghi lại đặc điểm của chúng tôi.

  • Nếu chúng ta không ở trong một khối ở cuối mỗi dòng, chúng ta sẽ ghi lại dòng đó.

  • Thuật toán chạy ở độ phức tạp thời gian O (nguồn). Nguồn là chuỗi đầu vào.

Ví dụ

#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;
}

Đầu ra

["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;
}