编写一程序,输入一C语言源程序,输出的结果不对源程序行改变,仅去掉所有注释的内容;把C语言中定义的符

编写一程序,输入一C语言源程序,输出的结果不对源程序行改变,仅去掉所有注释的内容;把C语言中定义的符,第1张

给你个删除所有注释的代码吧,暂时没考虑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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9493532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存