#include <stdio.h>
#include <string>
#include <cassert>
using namespace std;
#define ALPHABET_NUM 256
typedef enum {
ENUM_PATH,
ENUM_DATA
} enumtype;
char fsm[9][ALPHABET_NUM];
void initfsm()
{
memset(fsm[0],0,ALPHABET_NUM); // 初始状态
memset(fsm[1],1,ALPHABET_NUM); // 仅在
memset(fsm[2],5,ALPHABET_NUM); // 斜杠后非转义符
memset(fsm[3],1,ALPHABET_NUM);
memset(fsm[4],1,ALPHABET_NUM);
memset(fsm[5],1,ALPHABET_NUM);
fsm[0]['"']=1; // 读到第一个'"'
fsm[1]['"']=0; // 读到第二个'"',字符串结束
fsm[1]['\\']=2; // 字符串中遇到第一个'\'
fsm[2]['a']=3;
fsm[2]['b']=3;
fsm[2]['f']=3;
fsm[2]['n']=3;
fsm[2]['r']=3;
fsm[2]['t']=3;
fsm[2]['v']=3;
fsm[2]['\\']=4; // 连续两个反斜杠'\'
fsm[3]['"']=0;
fsm[4]['\\']=2; // 连续第三个'\'重新回到与第一个'\'相同状态
fsm[4]['"']=0;
fsm[5]['\\']=3;
fsm[5]['"']=0;
}
int main()
{
int state=0;
int flag=ENUM_PATH; // 默认为路径
char c;
std::string sPath = ""; // 路径,需要转换
std::string sData = ""; // 非路径,不需要转换(含转义字符)
FILE *fin=fopen("in.txt","r");
FILE *fout=fopen("out.txt","w");
initfsm();
while(fscanf(fin,"%c",&c)!=EOF)
{
state=fsm[state][c];
switch(state)
{
case 0:
sPath += c;
sData += c;
if (flag==ENUM_PATH) {
fprintf(fout, "%s", sPath.c_str());
}
else {
fprintf(fout, "%s", sData.c_str());
}
sPath = "";
sData = "";
flag=ENUM_PATH;
break;
case 2:
sPath += "";
sData += c;
break;
case 3:
sPath += '/'; sPath += c;
sData += c;
flag=ENUM_DATA;
break;
case 4:
sPath += '/'; // 连续2个反斜杠'\\', 第二个反斜杠'\\'忽略
sData += c;
break;
case 5:
sPath += '/'; sPath += c;
sData += c;
break;
default: // 1
sPath += c;
sData += c;
break;
}
}
fclose(fin);
fclose(fout);
return 0;
}