C程序设计语言 练习1-23

 通过标记状态“在字符中”,“在字符串中”,“在行注释//中”,“在段注释中/* */”,来决定是否继续往前读。

#include<stdio.h>
#include<stdlib.h>

#define MAX 4000

/* remove the comments in the code
test if it works? */
// test if it works?
int main(void){
    char code[MAX];
    int i;
    int c, s, line, para;
    int escape, slash, star;

    c = s = line = para = 0;    // mark the state when in '', "", // and /* */
    escape = slash = star = 0;  // mark the \, / and *
    for(i = 0; i < MAX-1 && (code[i] = getchar()) != EOF; ++i){
        // in ''?        
        if(code[i] == '\'' && c && escape == 0){
            c = 0;
        }
        else if(code[i] == '\'' && !c && !s && !line && !para){
            c = 1;
        } 
        // in ""?
        if(code[i] == '"' && s && escape == 0){
            s = 0;
        }
        else if(code[i] == '"' && !c && !s && !line && !para){
            s = 1;
        }
        // in line comment //?
        if(line && code[i] == '\n'){
            line = 0;
        }
        else if(!c && !s && !line && !para && code[i] == '/' && slash == 1){
            line = 1;
            --i;
        }        
        // in paragraph comment /* */?
        if(para && code[i] == '/' && star == 1){
            para = 0;
            --i;
        }
        else if(!c && !s && !line && !para && code[i] == '*' && slash == 1){
            para = 1;
            --i;
        }       
        // mark escape sequence
        if(code[i] == '\\'){
            if(escape == 1){
                escape = 0;
            }
            else escape = 1;
        }
        else escape = 0;
        // mark the * in paragraph comment
        if(para && code[i] == '*' && slash == 0){
            star = 1;
        }
        else star = 0; 
        // mark the first /
        if(!c && !s && !line && !para && code[i] == '/'){
            slash = 1;
        }
        else slash = 0;
        // if in comment
        if(line || para){
            --i;
        }            
    }
    code[i] = '\0';
    printf("%s", code);

    system("pause");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值