给你个删除所有注释的代码吧,暂时没考虑define和const定义的常量的替换
#include <stdioh>
#include <stdlibh>
int main (void)
{
enum
{
PROGRAM,
SLASH,
COMMENT,
STAR,
QUOTE,
LITERAL
} state;
int quote;
state = PROGRAM;
for (;;)
{
int c = getchar ();
if (c == EOF)
{
if (state == SLASH)
putchar ('/' / 1 / 1 / '\1');
break;
}
switch (state)
{
case SLASH:
if (c == "/"[1])
{
state = COMMENT;
break;
}
putchar ('/');
state = PROGRAM;
case PROGRAM:
if (c == '\'' || c == '"')
{
quote = c;
state = QUOTE;
putchar (c);
}
else if (c == "/"[0])
state = SLASH;
else
putchar (c);
break;
case COMMENT:
if (c == '')
state = STAR;
break;
case STAR:
if (c == '/')
state = PROGRAM;
else if (c != '')
{
state = COMMENT;
putchar (' ');
}
break;
case QUOTE:
putchar (c);
if (c == '\\')
state = LITERAL;
else if (c == quote)
state = PROGRAM;
break;
case LITERAL:
putchar (c);
state = QUOTE;
break;
default:
abort ();
}
}
return 0;
}
//将写好的helloc放入工程目录
#include<stdioh>
main()
{
FILE q,p; //声明两个文件指针
char a[1000],c;//数组a,字符c
int i,end;//i用于计数,end用于标记是否读到文件末尾
p=fopen("helloc","r");//读方式打开p
q=fopen("new_helloc","w");//写方式打开q
while((fgets(a,999,p))!=NULL)//读取一行存入a,循环直至文件末尾
{
end=0;//末尾标记置为0
for(i=0;a[i]!='\0';i++)//循环a中元素,直至字符串尾
{
if(a[i]!='/')fprintf(q,"%c",a[i]);//如果a[i]不是'/'就直接输出到q中(也就是new_helloc)
else//a[i]是'/'的情况
{
if(a[i+1]=='/')break;//如果下一个字符也是'/',说明出现了'//'随后都是注释,直接break读下一行
else if(a[i+1]=='')//如果下一个是'',是长注释
{
c=fgetc(p);//读下一个字符
while(c!=EOF)//防止意外,检查c是否到文件末尾
{
if(c=='')//如果c是
{
c=fgetc(p);//再读一个字符
if(c=='/')break;//如果是'/'说明到了注释的末尾,跳出
if(c==EOF)break;//如果是EOF,说明到了文件末尾,跳出
fprintf(q,"%c",c);//都不是,输出和又读的字符c
}
c=fgetc(p);//读下一字符
}
if(c=='/')//如果因为读到'/'而跳出上面的循环,说明经过的是注释
{
if((fgets(a,999,p))==NULL)//从此处再读一行,if内的语句总会执行
{
//fgets返回NULL说明到了文件尾
end=1;//结尾标志置1
break;//跳出
}
i=-1;//未到文件尾,i置-1,因为a重读了一行,在for循环中,保证下次从0开始
}
if(c==EOF)//如果因为读到EOF而跳出循环,说明不正常的读到了文件尾
{
end=1;//结尾标志置1
break;//跳出
}
}
else fprintf(q,"%c",a[i]);//正常情况,即'/'后不是''或'/',不是注释,输出
}
}
if(end==1)break;//结尾标志为1时,跳出循环
}
}
#include <stdioh>
#include <stringh>
#include <stdlibh>
#define MAX_LINE 1000
#define RMV "/ comm /"
int main()
{
char sLine[MAX_LINE];
char pPos;
freopen("examc","rb",stdin);
freopen("examout","wb",stdout);
while (gets(sLine))
{
while (pPos = strstr(sLine,RMV))
{
pPos = '\0';
strcat(sLine,pPos+strlen(RMV));
}
puts(sLine);
}
return 0;
}
下次考试题要自己做
以上就是关于编写一程序,输入一C语言源程序,输出的结果不对源程序行改变,仅去掉所有注释的内容;把C语言中定义的符全部的内容,包括:编写一程序,输入一C语言源程序,输出的结果不对源程序行改变,仅去掉所有注释的内容;把C语言中定义的符、将C语言源程序(hello.c)文件中所有注释删除后,存入另外一个文件(new_hello.c)、C语言编写一个程序将C源程序文件exam.c中的注释语句(/* comm. */)删除,然后存入文件exa等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)