把C/C++程序代码中的注释去掉,并返回结果

本文介绍了一段C语言代码,用于从字符串中移除特定的特殊字符,包括单引号、双引号、斜杠和注释符。通过遍历字符串并使用switch-case结构判断每个字符,实现字符过滤和跳过某些特定序列的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <string.h>
#include <fcntl.h>

void remove_commit(char *buf, size_t size) {

    char *p, *end, c;
    char *sq_start, *dq_start;
    char *lc_start, *bc_start;
    size_t len;
    p = buf;
    end = p + size;
    sq_start = NULL;
    dq_start = NULL;
    lc_start = NULL;
    bc_start = NULL;
    while (p < end) {
        c = *p;
        switch (c) {
        case '\'':
            if (dq_start || lc_start || bc_start) {
                p++;
                continue;
            }
            if (sq_start == NULL ) {
                sq_start = p++;
            } else {
                len = p++ - sq_start;
                if (len == 2 && *(sq_start + 1) == '\\') {
                    continue;
                }
                sq_start = NULL;
            }
            break;
        case '\"':
            if (sq_start || lc_start || bc_start) {
                p++;
                continue;
            }
            if (dq_start == NULL ) {
                dq_start = p++;
            } else {
                if (*(p++ - 1) == '\\') {
                    continue;
                }
                dq_start = NULL;
            }
            break;
        case '/':
            if (sq_start || dq_start || lc_start || bc_start) {
                p++;
                continue;
            }
            c = *(p + 1);
            if (c == '/') {
                lc_start = p;
                p += 2;
            } else if (c == '*') {
                bc_start = p;
                p += 2;
            } else {
                p++;
            }
            break;
        case '*':
            if (sq_start || dq_start || lc_start || bc_start == NULL ) {
                p++;
                continue;
            }
            if (*(p + 1) != '/') {
                p++;
                continue;
            }
            p += 2;
            memset(bc_start, ' ', p - bc_start);
            bc_start = NULL;
            break;
        case '\n':
            if (lc_start == NULL ) {
                p++;
                continue;
            }
            c = *(p - 1);
            memset(lc_start, ' ', (c == '\r' ? (p++ - 1) : p++) - lc_start);
            lc_start = NULL;
            break;
        default:
            p++;
            break;
        }
    }
    if (lc_start) {
        memset(lc_start, ' ', p - lc_start);
    }
}

int main(int argc, char *argv[]) {
    int fd, n;
    char buf[102400];
    fd = open("/home/lyd/Hello.c", O_RDONLY, 0);
    if (fd == -1) {
        return -1;
    }
    n = read(fd, buf, sizeof(buf));
    if (n == -1 || n == 0) {
        close(fd);
        return -1;
    }
    remove_commit(buf, n);
    *(buf + n) = '\0';
    printf(buf);
    close(fd);
    return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值