C语言的注释分为两种,第一种:在一行源代码中“//”后的内容为注释内容。第二种:“/”与“/”之间的内容为注释内容。第三种:程序中只出现了“/”,没有“/”与之对应,那么将“/”后的全部内容都要过滤掉。注意,只要是注释内容,那么注释内容中的字符应该全部忽略,即不起任何的作用。例如“/”与“/”之间如果再有“//”,那么“//”不应起作用;如果“//”再有“/”,那么“/”也不应起作用。
你的任务是先打开一个名字为dict.dic的文本文件,该文件中前5行每行为1个整数,从第6行开始为5段C语言的源代码。那5个数字代表这5段源代码结束的行数,比如如果第一行的整数为20,第二行的整数为60,则表示从第6行到第20为第一段代码,从第21行到第60为第二段代码。然后根据输入要求将源代码中所有注释过滤掉。
在本过滤注释系统中,你可以忽略源文件中双引号导致“//”、“/”、“/”失去作用的情况,即只要“//”、“/”、“*/”不是注释内容,在任何情况下都起作用。
注:也是字符串的匹配,讨论清楚并不复杂,注意细心。
#include<stdio.h>
#include<string.h>
void filter(int order, int a[]);
int main()
{
FILE* fp;
int a[6] = { 0 }, order = 0;
a[0] = 5;//减少讨论
scanf("%d", &order);
if ((fp = fopen("dict.dic", "r")) == NULL)
printf("Open dict.dic error!");
else
{
fscanf(fp, "%d\n%d\n%d\n%d\n%d\n", a + 1, a + 2, a + 3, a + 4, a + 5);
fclose(fp);
filter(order, a);
}
return 0;
}
void filter(int order, int a[])
{
FILE* fp = fopen("dict.dic", "r");
int count = 0;
char c = '\0', c1 = '\0', c2 = '\0';
char s[1000];
//先定位到第order段代码
while (count != a[order - 1])
{
fgets(s, 1000, fp);
count++;
}
count = 0;
while (count != a[order] - a[order - 1])
{
c = fgetc(fp);
if (feof(fp))
return;
if (c == '/')
{
c1 = c;
c2 = fgetc(fp);
if (c1 == '/' && c2 == '*')
{
while (!feof(fp))
{
c = fgetc(fp);
c2 = c;
if (c1 == '*' && c2 == '/')
{
c1 = '\0';
c2 = '\0';
break;
}
c1 = c2;
if (c == '\n')
{
count++;
}
if (count > a[order] - a[order - 1])
return;
}
}
else if (c1 == '/' && c2 == '/')
{
while (!feof(fp))
{
c = fgetc(fp);
if (c == '\n')
{
c = '\0';
c1 = '\0';
c2 = '\0';
count++;
printf("\n");
break;
}
}
}
else
{
printf("%c%c", c1, c2);
}
}
else
{
printf("%c", c);
}
if (c == '\n' || feof(fp) == -1)
count++;
}
fclose(fp);
}