《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);
}
}
阅读(2030) | 评论(0) | 转发(0) |