使用 C++ 删除字符串中的注释

给定一个 C++ 程序作为输入,删除其中的注释。'source' 是一个向量,其中源代码的第 i 行是 source[i]。这表示通过换行符 \n 拆分源代码字符串的结果。在C++中,我们可以创建两种类型的注释,即行注释、块注释。

字符串 '\\' 表示行注释,这意味着程序将忽略它右侧旁边的字符串。

字符串 '\* 和 *\' 是一个多行注释,表示从 '\* 开始直到 *\' 将被忽略的字符串。

第一个有用的注释优先于其他注释:如果字符串 // 出现在块注释中,它将被忽略。同样,如果字符串 /* 出现在行或块注释中,它也会被忽略。如果删除注释后某行代码为空,则不得输出该行 - 答案列表中的每个字符串都将为非空。

例如 -

输入 1 -

source = ["/*Test program */", "int main()", "{ ", " // 多变的

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(){

   // 多变的 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() /// 主功能

{

   int a, b, c;

   a = b + c;

}

说明- 字符串 /* 表示多行注释,包括第 1 行和第 6-9 行。字符串 // 将第 4 行表示为注释。

解决这个问题的方法

  • 我们将像理想的编译器一样逐行解析字符串。当我们遇到 // 或 '/* /*.' 时,我们将忽略这些块引号之间和之后的所有字符。

  • 函数 removeString(vector<string>&source) 将源代码作为输入并在删除其注释后返回代码。

  • 布尔变量comment 被初始化为false,它将检查特定的字符串或字符块是否是一个注释。

  • 如果我们开始一个块注释并且我们不在块中,那么我们将跳过接下来的两个字符并更改我们在该特定块中的状态。

  • 如果我们结束一个块注释并且我们在一个块中,我们将跳过接下来的两个字符并将我们的状态更改为不在一个块中。

  • 如果我们开始一行注释并且不在块中,我们将忽略该行的其余部分。

  • 如果我们不在块注释中(并且它不是注释的开始),我们将记录我们所在的字符。

  • 如果我们不在每行末尾的块中,我们将记录该行。

  • 该算法以O(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

   (“ source = ["/*Test program */", "int main()", "{ ", " // 多变的 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; // 多变的 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;

}

以上是 使用 C++ 删除字符串中的注释 的全部内容, 来源链接: utcz.com/z/327625.html

回到顶部