the c programing language 1-23 删除注释

来源:互联网 发布:淘宝售前和售后哪个累 编辑:程序博客网 时间:2024/06/05 20:05
/* * K&R2 1-23 * Author: Donmmi * 程序说明: *   代码核心: *     摘自中文版书参考手册A.2.2注释一节 *       注释的定义:注释以/和*开始,以*和/结束(//代码也加上了)。 *       注释不能够嵌套,也不能够出现在字符串字面值或字符字面值中。  *     程序用单引号、双引号标记字符字面值和字符串的起始和结束。还标记转义字符。 *     被转义的或者在字符串中的单引号、双引号属于正常字符,不作为字符串、字符字面值的起始和结束标志。 *     宏中包含奇数个双引号或单引号没有考虑 */#include <stdio.h>#define    IN    1#define    OUT    0#define    TRUE    1#define    FALSE    0/* 设置debug标志,用来调试程序,会输出进入单引号或双引号或注释后标志的值,还输出转义的字符 */int    debug = FALSE;        int main(void) {    int        c, escpc;    /* escpc变量用来保存被转义的字符 */    /* escpflag标记转义字符, cmtflag标记注释, strflag标记字符串, cnstflag标记字面量 */    int        escpflag, cmtflag, strflag, cnstflag;    int        nextc, cmtendc;    /* nextc保存字符用来判断注释结束字符,cmtendc保存注释结尾字符 */    cmtflag = strflag = cnstflag = OUT;    escpflag = FALSE;    while ((c = getchar()) != EOF) {        if (cmtflag == OUT) {            /* 不是常量字符并且不是字符串中的'/'为注释起始标志 */            if (c == '/' && strflag == OUT && cnstflag == OUT) {                if (c == '/') {                    cmtflag = IN;    /* 设置在注释中 */                    if (debug == TRUE)                        printf("[cmtflag:%d]", cmtflag);                }                nextc = getchar();                if (nextc == '/')                    cmtendc = '\n';    /* 设置注释结束字符,/后面是/,下个换行符表示注释结束 */                else if (nextc == '*')                    cmtendc = '/';    /* 如果/后面是*,下个/表示注释结束 */            } else {                if (strflag == OUT && c == '\'') {        /* 标记字面量 */                    if (cnstflag == OUT)                        cnstflag = IN;                    else                        cnstflag = OUT;                }                if (cnstflag == OUT && strflag == OUT && c == '"') /* 标记字符串 */                    strflag = IN;                else if (strflag == IN && c == '"')                    strflag = OUT;                if ((cnstflag == IN || strflag == IN) && c == '\\') {    /* 标记转义符 */                    escpc = getchar();        /* 获取下个字符并且保存 */                    escpflag = TRUE;                }                putchar(c);                if (debug == TRUE) {                    if (c == '"')                        printf("[cnstflag:%d strflag:%d]", cnstflag, strflag);                }                if (escpflag == TRUE) {                    if (debug == TRUE)                        printf("[escaped:%c]", escpc);                    else                        putchar(escpc);                    escpflag = FALSE;                }            }        } else if (cmtendc == c)        /* 判断是否到达注释结尾 */            cmtflag = OUT;    }    return 0;}

0 0