剔除编译可通过的C++程序COMMENT

来源:互联网 发布:数据泄密安全 编辑:程序博客网 时间:2024/05/21 22:51

忙里偷闲发现代码好乱,重新写了下去除COMMENT的程序,应该可以算是比较完美的版本.凡是能编译通过的,经过测试大部分都可以正确运行.

代码如下:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

string load_file(string sPath)
{
 string s;
 string sWhole;
 ifstream in(sPath.c_str());

 while (getline(in, s))
 {
  sWhole += s + "/n";
 }

 return sWhole;
}

string comment_out(string sSource)
{
 int iState = 0;
 int i = 0;
 char cTmp;
 char cBuffer[16] = {0};
 string sOut;
 
 while (i <= sSource.length())
 {
  cTmp = sSource[i];

  switch (iState)
  {
   case 0:
   {
    if (cTmp == '/')
    {
     iState = 1;
     cBuffer[0] = cTmp; 
    }
    else
    {
     if (cTmp == '"')
     {
      iState = 5;
      sOut += cTmp;
     }
     else
     {
      if (cTmp == '/'')
      {
       iState = 6;
       sOut += cTmp;
      }
      else
      {
       sOut += cTmp;
      }
     }
    }
    break;
   }
   case 1:
   {
    if (cTmp == '/')
    {
     iState = 2;
    }
    else
    {
     if (cTmp == '*')
     {
      iState = 3;
     }
     else
     {
      iState = 0;
      sOut += cBuffer[0];
      sOut += cTmp;
     }
    }
    break;
   }
   case 2:
   {
    if (cTmp == '/n')
    {
     iState = 0;
     sOut += '/n';
    }
    break;
   }
   case 3:
   {
    if (cTmp == '*')
    {
     iState = 4;
    }
    break;
   }
   case 4:
   {
    if (cTmp == '/')
    {
     iState = 0;
    }
    else
    {
     iState = 3;
    }
    break;
   }
   case 5:
   {
    if (cTmp == '"')
    {
     iState = 0;
     sOut += cTmp;
    }
    else
    {
     if (cTmp == '//')
     {
      if (sSource[i+1] == '/"')
      {
       sOut += '//';
       sOut += '"';
       i++;
      }
      else
      {
       sOut += cTmp;
      }
     }
     else
     {
      sOut += cTmp;
     }
    }
    break;
   }
   case 6:
   {
    if (cTmp == '/'')
    {
     iState = 0;
     sOut += cTmp;
    }
    else
    {
     if (cTmp == '//')
     {
      if (sSource[i+1] == '/'')
      {
       sOut += '//';
       sOut += '/'';
       i++;
      }
      else
      {
       sOut += cTmp;
      }
     }
     else
     {
      sOut += cTmp;
     }
    }
    break;
   }
  }
  i++;
 }

 return sOut;
}

int main(int argc, char* argv[])
{
 string s;

 s = load_file("ComOut.cpp");
 cout << comment_out(s) << endl;
 return 0;
}