Chinaunix首页 | 论坛 | 博客
  • 博客访问: 359136
  • 博文数量: 53
  • 博客积分: 139
  • 博客等级: 入伍新兵
  • 技术积分: 589
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-27 01:55
个人简介

学习linux,学习编程。

文章分类

全部博文(53)

文章存档

2019年(1)

2018年(4)

2016年(4)

2014年(11)

2013年(33)

分类: C/C++

2014-09-13 04:43:50

《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);
    }
}



阅读(1976) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~