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

ลบคอมเมนต์ในสตริงโดยใช้ C++

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

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

สตริง '/* และ */' เป็น multi-line comment แสดงถึงสตริงเริ่มต้นจาก '/* จนถึง '*/' จะถูกละเว้น

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

ตัวอย่าง

อินพุต

source = ["/*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;", "}"]

วิธีการแก้ปัญหา

  • เราจะแยกวิเคราะห์สตริงทีละบรรทัดเหมือนคอมไพเลอร์ที่สมบูรณ์ เราจะละเว้นอักขระทั้งหมดระหว่างและหลัง block quotes เหล่านี้เมื่อเราพบ // หรือ '/* /*'
  • ฟังก์ชัน removeString(vector<string>& source) รับซอร์สโค้ดเป็นอินพุตและคืนโค้ดหลังจากลบคอมเมนต์
  • ตัวแปร Boolean comment เริ่มต้นเป็น false ซึ่งจะตรวจสอบว่าบล็อกของสตริงหรืออักขระเฉพาะเป็นคอมเมนต์หรือไม่
  • หากเราเริ่ม block comment และเราไม่อยู่ในบล็อก เราจะข้ามอักขระถัดไปสองตัวและเปลี่ยนสถานะในบล็อกนั้นๆ
  • หากเราจบ block comment และเราอยู่ในบล็อก เราจะข้ามอักขระถัดไปสองตัวและเปลี่ยนสถานะเป็นไม่อยู่ในบล็อก
  • หากเราเริ่ม line comment และไม่อยู่ในบล็อก เราจะละเว้นส่วนที่เหลือของบรรทัด
  • หากเราไม่อยู่ใน block comment (และไม่ใช่การเริ่มต้นของคอมเมนต์) เราจะบันทึกอักขระที่เราอยู่
  • หากเราไม่อยู่ในบล็อกที่ท้ายของแต่ละบรรทัด เราจะบันทึกบรรทัดนั้น
  • อัลกอริทึมทำงานในเวลา O(source) source คือสตริงอินพุต

ตัวอย่างโค้ด

#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 = {"/*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;
    }
    return 0;
}

ผลลัพธ์

["int main()","{ "," ","int a, b, c;","a = b + c;","}"]