#include <stdio.h>
#include <stdlib.h>
//如果引号前面有偶数个\,说明字符串结束
int checkStrEnd(char *buf, int i)
{
int n = 0;
while (i >= 0)
{
if (buf[i--] != '\\')
{
break;
}
n++;
}
return !(n & 1);
}
int readBuffer(FILE *fp, char *buf, int length)
{
int i = 0, inStr = 0, ch, strStart;
while (i < length)
{
ch = fgetc(fp);
if (ch == '\n' || feof(fp))
{
return i;
}
else if ((ch == '\'' || ch == '"') && !inStr)
{
strStart = ch;
inStr = 1;
}
else if (inStr && ch == strStart && checkStrEnd(buf, i - 1))
{
inStr = 0;
}
else if (ch == '/' && !inStr)
{
ch = fgetc(fp);
if (ch == '/')
{
while (!feof(fp) && fgetc(fp) != '\n');
return i;
}
else if (ch == '*')
{
int c = fgetc(fp), d = fgetc(fp);
while (!feof(fp) && !(c == '*' && d == '/'))
{
c = d;
d = fgetc(fp);
}
continue;
}
else
{
buf[i++] = '/';
}
}
buf[i++] = ch;
}
return -1;
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
return -1;
}
FILE *fp = fopen(argv[1], "r");
if (!fp)
{
return -1;
}
char buf[1024];
while (!feof(fp))
{
int j = readBuffer(fp, buf, 1024);
if (j < 0)
{
return -1;
}
for (int i = 0; i < j; i++)
{
putchar(buf[i]);
}
putchar('\n');
}
fclose(fp);
return 0;
}
编译原理实验(二):去掉c语言源程序中的注释
最新推荐文章于 2024-06-08 22:44:41 发布