Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ลบความคิดเห็นในสตริงโดยใช้ C++


ให้โปรแกรม C++ เป็นอินพุต ให้ลบความคิดเห็นออกจากโปรแกรม 'source' เป็นเวกเตอร์ที่บรรทัดที่ i ของซอร์สโค้ดคือซอร์ส[i] นี่แสดงถึงผลลัพธ์ของการแยกสตริงซอร์สโค้ดด้วยอักขระขึ้นบรรทัดใหม่ \n ใน C++ เราสามารถสร้างความคิดเห็นได้ 2 ประเภท ได้แก่ ความคิดเห็นในบรรทัด การบล็อกความคิดเห็น

สตริง '\\' หมายถึงความคิดเห็นของบรรทัด ซึ่งหมายความว่าสตริงที่อยู่ถัดจากสตริงทางด้านขวาจะถูกละเว้นโดยโปรแกรม

สตริง '\* และ *\' เป็นความคิดเห็นแบบหลายบรรทัดที่แสดงสตริงที่เริ่มต้นจาก '\* จนถึง *\' จะถูกละเว้น

ความคิดเห็นที่มีประโยชน์แรกมีความสำคัญเหนือกว่าความคิดเห็นอื่น:หากสตริง // เกิดขึ้นในความคิดเห็นแบบบล็อก ข้อคิดเห็นนั้นจะถูกละเว้น ในทำนองเดียวกัน หากสตริง /* เกิดขึ้นในบรรทัดหรือบล็อกความคิดเห็น ก็จะถูกละเว้นเช่นกัน หากโค้ดบางบรรทัดว่างเปล่าหลังจากลบความคิดเห็น คุณต้องไม่ส่งออกบรรทัดนั้น - แต่ละสตริงในรายการคำตอบจะไม่ว่างเปล่า

ตัวอย่างเช่น −

อินพุต-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) รับซอร์สโค้ดเป็นอินพุตและส่งคืนโค้ดหลังจากลบความคิดเห็นออกแล้ว

  • ความคิดเห็นของตัวแปรบูลีนเริ่มต้นเป็นเท็จ ซึ่งจะตรวจสอบว่าบล็อกสตริงหรืออักขระเฉพาะนั้นเป็นความคิดเห็นหรือไม่

  • หากเราเริ่มบล็อกความคิดเห็นและเราไม่ได้อยู่ในบล็อก เราจะข้ามอักขระสองตัวถัดไปและเปลี่ยนสถานะของเราในบล็อกนั้น

  • หากเรายุติความคิดเห็นแบบบล็อกและอยู่ในบล็อก เราจะข้ามอักขระสองตัวถัดไปและเปลี่ยนสถานะไม่ให้อยู่ในบล็อก

  • หากเราเริ่มแสดงความคิดเห็นในบรรทัดและไม่ได้อยู่ในบล็อก เราจะเพิกเฉยต่อส่วนที่เหลือของบรรทัด

  • หากเราไม่ได้อยู่ในบล็อกความคิดเห็น (และไม่ใช่จุดเริ่มต้นของความคิดเห็น) เราจะบันทึกตัวละครที่เราเป็นอยู่

  • หากเราไม่อยู่ในบล็อกที่ส่วนท้ายของแต่ละบรรทัด เราจะบันทึกบรรทัดนั้น

  • อัลกอริทึมทำงานในความซับซ้อนของเวลา 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;
}