忙里偷闲发现代码好乱,重新写了下去除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;
}