C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++を使用して文字列内のコメントを削除します


入力としてC++プログラムを指定し、コメントを削除します。 「ソース」は、ソースコードのi番目の行がsource[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行目をコメントとして示します。

この問題を解決するためのアプローチ

  • 理想的なコンパイラと同じように、文字列を1行ずつ解析します。 //または‘/ * / *に遭遇した場合、これらのブロック引用符の間およびその後のすべての文字を無視します。

  • 関数removeString(vector &source)は、ソースコードを入力として受け取り、コメントを削除した後にコードを返します。

  • ブール変数のコメントはfalseとして初期化され、文字列または文字の特定のブロックがコメントであるかどうかをチェックします。

  • ブロックコメントを開始し、ブロック内にいない場合は、次の2文字をスキップして、その特定のブロックの状態を変更します。

  • ブロックコメントを終了してブロック内にいる場合は、次の2文字をスキップして、ブロック内にないように状態を変更します。

  • 行コメントを開始し、ブロック内にない場合、残りの行は無視されます。

  • ブロックコメントに含まれていない場合(そしてコメントの開始ではなかった場合)、現在のキャラクターを記録します。

  • 各行の終わりにブロックがない場合は、その行を記録します。

  • アルゴリズムは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;
}

  1. C++を使用して文字列から特定の単語を削除する

    この記事では、特定の文字列から特定の単語を削除する問題を解決します。例- Input : str = “remove a given word ”, word = “ remove ” Output : “ a given word ” Input : str = “ god is everywhere ”, word = “ is ” Output : “ god everywhere ” 解決策を見つけるためのアプローチ たとえば、単純なアプロ

  2. C++を使用して文字列の部分文字列の数を見つける

    この記事では、特定の文字列に形成できるサブ文字列(空ではない)の数を見つけるためのアプローチについて学習します。 Input : string = “moon” Output : 10 Explanation: Substrings are ‘m’, ‘o’, ‘o’, ‘n’, ‘mo’, ‘oo’, ‘on’, ‘moo’, ‘oon’ and &