【问题描述】
程序相似性比较方法之一就是将源程序中无关信息(如变量名、空白符等)删除后的代码进行比较。编写程序将当前目录下C源文件input.c中的变量名、空白字符删除后写到另一个文件output.c中。
【输入形式】
要处理的C源文件名为input.c,在当前目录下,并假设该文件符合以下条件:
1、程序中只有一个main函数;
2、最多只可能出现一个int类型变量列表(也可能没有),无其它类型变量说明或定义,并且在程序其它地方不会再出现int关键字;
3、定义的int类型变量的个数不超过10个,变量名的长度不超过20个字符;
4、源文件中不含注释;
5、程序没有语法错误;
6、字符串常量中不会出现与变量名相同的串;
7、程序中所有标识符均与其它部分有空格分隔(即可用格式串%s读取),所有标识符的长度不超过20个字符;并且int类型变量定义中的分隔符’,’和结束符’;’与其它部分也有空格分隔;
8、程序中可以有int类型数组定义,在数组定义和使用时,数组名与其它部分也有空格隔开。
【输出形式】
将源程序文件input.c处理后的结果写入到当前目录下的文件output.c中,输出要求:
1、所有空白字符(包括空格、制表符和回车符)都要删除;
2、定义的int类型变量(包括定义的数组名)都要删除,但不删除定义时用到的分隔符’,’;
3、语句中所有int类型变量名(包括数组名)都要删除。
【样例输入】
假如input.c文件内容如下:
#include
main ()
{
int a , b , sum , arr [10] ;
scanf ( "%d%d", & a , & b );
arr [0] = a ;
arr [1] = b ;
sum = arr [0] + arr [1] ;
printf ( "%d", sum );
}
【样例输出】
output.c内容应为:
includemain(){int,,,[10];scanf("%d%d",&,&);[0]=;[1]=;=[0]+[1];printf("%d",);}
【样例说明】
在源文件input.c中,定义了三个int类型变量:a,b,sum,以及一个int类型数组arr,将程序中所有空白符(空格、制表符、回车符)、变量名a、b、sum和数组名arr删除后,就只剩一行字符串(见output.c中内容)。
提示:
1、可以用fscanf(fp,”%s”,str)函数将fp文件中的内容以单词的形式读出,到达文件结尾时该函数返回EOF;
2、可以用strcmp函数比较两个字符串,用strcpy函数拷贝字符串,这两个函数定义在
#include
#include
#include
int main() {
FILE *f, *g;
int i, j, k=0, t = 0,flag=0;
char words[200][20],ch[20][20];
f = fopen("input.c", "r");
g = fopen("output.c", "w");
while (!feof(f)) {
fscanf(f, "%s", words[k++]);
}
rewind(f);
for (i = 0; i < k; i++) {
if (strcmp(words[i], "int")==0) {
i+=1;
while (strcmp(words[i], ";") != 0) {
char c = words[i][0];
if ((strcmp(words[i], ",") != 0)&&(c!='[')) {
strcpy(ch[t++], words[i]);
}
i++;
}
break;
}
}
for (i = 0; i < k ; i++) {
for (j = 0; j < t; j++) {
if (strcmp(words[i], ch[j]) == 0) {
flag = 1;
}
}
if (!flag) {
fprintf(g, "%s", words[i]);
}
flag = 0;
}
fclose(f);
fclose(g);
}