求解怎么用c/c++程序实现去掉一个指定c文件中的注释,帮我看看我代码哪里有问题

其他的都省了,filedata是个数组,已经把c文件内容读取到filedata中,这个函数实现的注释删除功能,但是有问题,每次都有残留注释,求解哪里有问题,或者哪位大神有... 其他的都省了,filedata是个数组,已经把c文件内容读取到filedata中,这个函数实现的注释删除功能,但是有问题,每次都有残留注释,求解哪里有问题,或者哪位大神有代码,分享一下!!!
int delete_comment(char *filedata)
{
char *fast = filedata;
char *slow = filedata;
char str[] = "/*";
char estr[] = "*/";

while((slow = strstr(filedata, str)) != NULL)
{
fast = strstr(slow, estr);
fast += 3;
strcpy(slow, fast);

fast = slow = filedata;
}

strcpy(str, "//");
while((slow = strstr(filedata, str)) != NULL)
{
fast = strchr(slow, '\n');
printf("\n");
strcpy(slow, ++fast);
fast = slow = filedata;
}

return 0;
}
展开
 我来答
zhangsonglin_c
高粉答主

2015-06-12 · 醉心答题,欢迎关注
知道大有可为答主
回答量:3.7万
采纳率:83%
帮助的人:6776万
展开全部
fast += 3;
错误,应该是fast+=2;
strcpy(slow, ++fast);
错误,回车不应删除,而且删除了下一行开头的第一个字符。应该是strcpy(slow, fast);
应该考虑//,/**/在引号内部的情况。不属于注释。引号内部\"还要排除。
用字符串处理,有限制。不同的系统有不同的限制。不如直接读取文件字符,分析,丢弃注释,输出其余字符至另一文件。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char *arg[])
{
char finname[50],fonname[50],ch1,ch2;
FILE *fin,*fout;

if (argc==1)
{
printf("please input input file name:");
gets(finname);
printf("please input output filename:");
gets(fonname);
}
else
{
strcpy(finname,arg[1]);
if (argc==3) strcpy(fonname,arg[2]);
else strcpy(fonname,"");
}
if (strlen(fonname)==0) {strcpy(fonname,finname);strcat(fonname,"tx");}
fin=fopen(finname,"r");
fout=fopen(fonname,"w");
do {
ch1=fgetc(fin);
switch(ch1){
case '\"':fputc(ch1,fout);
do {
ch1=fgetc(fin);
if (ch1=='\"')
{
fputc(ch1,fout);
break;
}
else if (ch1=='\\')
{
fputc(ch1,fout);
ch1=fgetc(fin);
fputc(ch1,fout);
}
else fputc(ch1,fout);
}while(!feof(fin));
break;
case '/':ch2=fgetc(fin);

switch (ch2) {
case '/':
do {ch1=fgetc(fin);}while (ch1!='\n' && !feof(fin));
if (ch1=='\n') fputc(ch1,fout);
break;
case '*':
ch1=fgetc(fin);
ch2=fgetc(fin);
do{
if (ch1=='*' && ch2=='/') break;
else {
ch1=ch2;
ch2=fgetc(fin);
}

} while (!(ch1=='*' && ch2=='/') && !feof(fin));

break;
default:
fputc(ch1,fout);
fputc(ch2,fout);
}

break;
default:
fputc(ch1,fout);
}
}while (!feof(fin));

fclose(fin);
fclose(fout);
printf("Done!");
system("PAUSE");
return 0;
}

示例文件:123.c
#include "stdio.h"
#include "conio.h"

/*ll
ll*/abc
//........
abc//--------

int main()
{
int a;
printf("1\"哈哈\"\n2\"嘿嘿\"\n3\"哦哦/**///\"\n");
scanf("%d",&a);
printf("a=%d\n",a);
if(a==1) printf("1哈哈\n");
if(a==2) printf("2嘿嘿\n");
if(a==3) printf("3哦哦\n");
getch();
return 0;
}
输出文件:123.ctx
#include "stdio.h"
#include "conio.h"

abc

abc

int main()
{
int a;
printf("1\"哈哈\"\n2\"嘿嘿\"\n3\"哦哦/**///\"\n");
scanf("%d",&a);
printf("a=%d\n",a);
if(a==1) printf("1哈哈\n");
if(a==2) printf("2嘿嘿\n");
if(a==3) printf("3哦哦\n");
getch();
return 0;
}
baldeagle110
2015-06-11 · 超过67用户采纳过TA的回答
知道小有建树答主
回答量:144
采纳率:86%
帮助的人:71.5万
展开全部
我觉得用正规表达式来实现会更简单一些。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式