这是我的程序,我正在尝试删除单行&多行评论......
这里我使用命令行参数来执行程序
$./a.out sample.c sample.i
我想删除c文件中的注释,并获得纯预处理的纯c文件..
在执行我的程序时,它会给出分段错误,并且不会删除注释...
任何人都可以尝试这个并告诉我程序中出现错误的位置以及如何避免错误..
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main(int argc,char **argv)
{
FILE *fp;
char *s=NULL,*p=NULL,*q=NULL;
int i,size,j;
if(argc!=3)
{
printf("error : improper use of file\n");
printf("use : ./file <filename.c> <filename.i>\n");
return;
}
fp=fopen(argv[1],"r");
if(fp==NULL)
{
printf("file does not exist\n");
return;
}
fseek(fp,0,2);
size=ftell(fp)+1;
rewind(fp);
s=calloc(1,size);
fread(s,size-1,1,fp);
fclose(fp);
puts(s);
p=s;
for(i=0;s[i];i++)
{
if(p=strchr(p,'"'))
{
p++;
while(!(p=strchr(p++,'"')));//with in printf("....// .... /*....*/ ..") the comment cant be removed
i=p-s;
printf("i=%d\n",i);
puts(s);
}
else if(p=strstr(p,"//"))
{
while(*p!='\n')
*p++=' ';
i=p-s;
printf("i=%d\n",i);
puts(s);
}
if(p=strstr(p,"/*"))
{
j=p-s;
while(!(p=strstr(p,"*/")))
p++;
strcpy(s+j,p+2);
i=p+2-s;
printf("i=%d\n",i);
puts(s);
}
}
puts(s);
fp=fopen(argv[2],"w");
size=strlen(s)-1;
fwrite(s,size,1,fp);
fclose(fp);
}
这里是我想删除此c文件中的注释的sample.c程序
#include<stdio.h>//declaring stdio header file
#include<stdlib.h>/*declaring stdlib header file*/
main()//main function starts
{
int a,b;//declaring integer variables
printf("Enter // a & b:");
scanf("%d%d",&a,&b);/* taking a & b from std i/p device */
printf("/* result %d * %d = %d */\n",a,b,a*b);//printing result
}
我希望输出应该是
#include<stdio.h>
#include<stdlib.h>
main()
{
int a,b;
printf("Enter // a & b:");
scanf("%d%d",&a,&b);
printf("/* result %d * %d = %d */\n",a,b,a*b);
}
答案 0 :(得分:0)
当我针对测试文件运行时,它会在行
上崩溃if(p=strchr(p,'"'))
原因是如果找不到匹配的字符串或字符,strstr
amd strstr
将返回NULL
,因此您可能不想要将结果分配回p
。
一些尼特:
没有理由将整个文件读入内存。这种方法不会扩展,它只会增加许多错误。
如上所述,此代码不能很好地处理嵌套注释(如果在//
分隔块中嵌入了/* */
分隔注释,会发生什么?) 。它也不会处理转义的"
字符;例如,如果你有一个像"the quote character is \""
这样的字符串,你的引用处理块将错误地假设第三个"
之后的所有内容都是字符串文字的一部分,当它不是时。