删除文件中的注释c 语言,C 语言程序-删除 C 语言程序中所有的注释语句

《C程序设计语言(等2版)》,美国作者Brian W. Kernighan, Dennis M. Ritchie。徐宝文,李志翻译。

练习1-23, 编写一个程序,删除 C 语言程序中所有的注释语句。要注意处理带引号的字符串与字符常量。在C语言中不允许嵌套。

编程的一些说明:注释包括两种形式,/*   */ ,和//(双斜线是为了实用而新增加的)。双引号字符表示为' \" ',或者是\"。另外,字符串里的//,/*和 */不起注释作用。程序如下所示(包括编程思路):

/*

removeannotates.c  version 0.1  shencz2000 2014-9-14

if (取一个字符,该字符不是文件结束字符) {

while (还没有处理的字符) {

确定当前状态(包括注释状态,引用状态和双斜线状态)

根据状态来确定是否打印字符

}

}

根据状态来确定是否打印最后一个字符

细节部分如下:

---------------------------------------

1,根据状态来确定是否打印字符

if(当前字符不是'/',并且当前的注释状态是开始状态)

打印该字符

if (当前字符是’/',并且上一个字符不是'*',并且下一个字符不是'/'并且下一个字符不是'*',并且当前的注释状态是结束状态)

打印当前字符

lastchar = c

c = nextchar

----------------------------------------

2,根据状态来确定是否打印最后一个字符

if (上一个字符不是'/',并且注释状态变量是结束状态)

打印当前字符;

else if (上一个字符是'/',并且当前字符不是'/',并且当前字符不是'*',并且注释状态变量是结束状态)

打印当前字符;

----------------------------------------

3, 确定当前状态部分

if(如果最近两个字符是"/ *",并且引用状态变量是结束状态,并且注释状态是结束状态)

注释状态变量 = 开始状态

else if(如果最近两个字符是"* /",并且引用状态变量是结束状态,并且注释状态是开始状态)

注释状态变量 = 结束状态

else if(如果最近两个字符是"/ /",并且twoslash == 结束状态,并且引用状态变量是结束状态,并且注释状态是结束状态){

注释状态变量 = 开始状态

twoslash = 开始状态

}

else if(如果当前字符是'\n',并且twoslash == 开始状态,并且引用状态变量是结束状态,并且注释状态是开始状态){

注释状态变量 = 结束状态

twoslash = 结束状态

}

if(当前字符是'\"',并且上一个字符不是'\\',并且注释状态是结束状态,并且引用状态变量是结束状态)

引用状态变量 = 开始状态

else if(当前字符是'\"',并且上一个字符不是'\\',并且注释状态是结束状态,并且引用状态变量是开始状态)

引用状态变量 = 结束状态

*/    /* hello */        /* hello */

#include // remove annotates in c program

main()

{

int  lastchar, c, nextchar;

enum boolean {END, START};

int annotate, quote, twoslash;  //they are varies about status

annotate = END;

quote = END;

twoslash = END;

lastchar = 'a';

if ((c = getchar()) != EOF) {

while ((nextchar = getchar()) != EOF) {

if (lastchar == '/' && c == '*' && ! annotate && ! quote)

annotate = START;

else if (lastchar == '*' && c == '/' && annotate && ! quote)

annotate = END;

else if (lastchar == '/' && c == '/' && ! twoslash && ! annotate && ! quote) {

annotate = START;

twoslash = START;

}

else if (c == '\n' && twoslash && annotate && ! quote) {

annotate = END;

twoslash = END;

}

if (lastchar != '\\' && c == '\"' && ! annotate &&  ! quote)

quote = START;

else if (lastchar != '\\' && c == '\"' && ! annotate && quote == START)

quote = END;

if (c != '/' && ! annotate)

putchar(c);

else if ( c == '/' && lastchar != '*' && nextchar != '*' && nextchar != '/' && ! annotate)

putchar(c);

lastchar = c;

c = nextchar;

}

if (lastchar != '/' && ! annotate)

putchar(c);

else if (lastchar == '/' && c != '/' && c != '*' && ! annotate)

putchar(c);

}

}

阅读(1154) | 评论(0) | 转发(0) |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值