在另一个C程序中没有注释的嵌套!
我稍后给出我的答案!
我的答案,很乱,请楼主公布下你的?
#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);
}
不需要栈,因为题目说没有嵌套。这是我的答案……
[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]