当前位置: 代码迷 >> C语言 >> [讨论]C语言的注释的删除!
  详细解决方案

[讨论]C语言的注释的删除!

热度:166   发布时间:2007-11-15 10:43:46.0
[讨论]C语言的注释的删除!
编写一个C程序来删除另一个程序中的注释,要正确处理带引号的字符串与字符常量
在另一个C程序中没有注释的嵌套!
我稍后给出我的答案!
搜索更多相关的解决方案: C语言  注释  删除  

----------------解决方案--------------------------------------------------------
寻找到/*后在发现第一个*/前将所有内容删除就可以了
----------------解决方案--------------------------------------------------------
我在百度面试时遇到这题。不过注释有两种/**/和//的,当时要我画出有穷状态机!只考虑/**/不全面吧!
----------------解决方案--------------------------------------------------------

w我等下看天方夜谭 理解这题目 菜鸟1个 还不会飞


----------------解决方案--------------------------------------------------------

我的答案,很乱,请楼主公布下你的?
#include <stdio.h>
#include <stdlib.h>
#define N 1024

FILE* Openfile(char* filename,char* mode)
{
FILE *result;
result = fopen(filename,mode);
if(result == NULL)
{
cout << "不能打开文件:" << filename << ". " << endl;
exit(1);
}
return result;
}

void source(char infilename[],char outfilename[])
{
FILE* infp = Openfile(infilename, "r+");
FILE* outfp = Openfile(outfilename, "w+");
//flag为真则表明是注释
int flag = 0, flag1 = 1;
char ch, nch, str[N];
while(!feof(infp))
{
ch = fgetc(infp);
if(!flag)
{
if(ch == '/')
{
nch = fgetc(infp);
if(nch == '*')
flag = 1;
else if(nch == '/')
{
flag1 = 0;
fgets(str,N,infp);
fputs("\n",outfp);
}
else
ungetc(nch,infp); //若还不是注释,退格一个字符
}
}
if((!flag) && flag1)
{
if(ch!= EOF)
fputc(ch, outfp);

}
flag1 = 1;
if(flag)
{
if(ch == '*')
{
nch = fgetc(infp);
if(nch == '/') //出现了“*/”,注释结束
flag = 0;
else
ungetc(nch, infp); //若还是注释,则要退格一个字符
}
}
}
fclose(infp);
fclose(outfp);
}


----------------解决方案--------------------------------------------------------
另外我还有一个提取源文件中的注释的程序,也都很乱,实现思路跟上面差不多,就不发了
----------------解决方案--------------------------------------------------------
北电笔试的题目,要求把一个程序里的/* */类型的注释清除掉,但是不清除//类型的注释… 不过北电是英文题

[此贴子已经被作者于2007-11-16 17:48:59编辑过]



----------------解决方案--------------------------------------------------------
//把这一行中//以后的都删除不就行了~~
----------------解决方案--------------------------------------------------------

用栈来解决


----------------解决方案--------------------------------------------------------

不需要栈,因为题目说没有嵌套。这是我的答案……

[CODE]void progress(char* str){
char *beg,*tmp,rt=0;
while(*str){
if(*str=='\"'){
while(*++str!='\"')
if(*str=='\\')str++;
str++;
}else if(rt==0 && *str=='/'){
beg=str++;
if(*str=='*' || *str=='/')
rt=(str=='*')+1;
}else if( (rt==1 && *str=='\n') ||
(rt==2 && (*str=='*' && *++str=='/')) ){
tmp=beg;str++;
while(*beg++=*str++);
str=tmp;rt=0;
}else
str++;
}
}[/CODE]
有点乱。rt代表是否注释,为1代表是新式的//注释,为2代表是旧式的/*...*/对于字符串有简要的判断。下面是测试函数:
[CODE]int main(){
char str[]="//注释1\nvoid main(){\n /*注释2*/\n printf(\"/*这不是注释*/\");\n /*注释3\n //我在注释3里面\n */\n}\n";
printf(str);
printf("\n***********************\n");
progress(str);
printf("\n***********************\n");
printf(str);
getchar();
return 0;
}[/CODE]


----------------解决方案--------------------------------------------------------
  相关解决方案