列表

详情


NC13588. 从后台研发到跑路

描述

vigoss18在某997工作制的公司上班,终于有一天爆发了,决定要跑路。
既然要跑路了,当然得对自己的代码做点手脚,既要保证走了之后代码仍然可以运行,又要保证走了之后别人维护不了,所以决定写个程序,用来批量把代码中的注释全部删掉。

vigoss18是一个强烈的强迫症患者,他的代码都符合下面这些规则:
1.所有的注释都是/**/风格的,两个星号中间的内容为注释内容,需要把这个符号和里面的内容全部去掉
2.代码中经常会出现引号,用来表示字符串,如果/**/出现在引号内部,那么就认为不是注释,是不能被去掉的
3.vigoss18的代码保证不会出现/**/镶套,但是可能会出现/*/**/和/**/*/这种情况,对于前者,有两个/*,第一个先匹配,第二个/*被认为是注释内部的内容;对于后者,第一个*/被匹配,第二个*/找不到左边匹配的,所以被认为是文本,需要保留下来。
4.代码中可能会出现一半注释符号,比如单独的/*,或者单独的*/,这个时候认为不是注释,需要保留下来.
5.注释外的引号,保证一定是合法的,即每个引号一定是有对应的另一个引号成对匹配的。
6.代码中可能会出现引号前面有反斜杠的情况,那么这时引号会被转义,只被认为是个单纯的符号,不起到匹配字符串的效果。
7.代码保证只有引号才有转义的情况发生,即除了引号,其他符号都不需要考虑前面有反斜杠然后被转义。

输入描述

对于每个输入文件,处理到文件尾。 输入如题意描述,保证单个输入文件不超过5kb

输出描述

输出去掉注释以后的内容,除了注释以外的内容全部需要输出,卿不要漏掉换行空格之类的。

示例1

输入:

a b/*666
2333*/c" lihai/*le*/\"/*666*/"
/*

输出:

a bc" lihai/*le*/\"/*666*/"
/*

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 183ms, 内存消耗: 59296K, 提交时间: 2023-03-28 17:24:19

import sys
def main():
    lines = sys.stdin.readlines()
    code = ''.join(lines)
    i = 0
    code_len = len(code)
    in_str = 0
    while i < code_len:
        if code[i] == '"' and (i == 0 or code[i - 1] != '\\'):
            in_str ^= 1
        if in_str == 0 and code[i] == '/' and i + 3 < code_len and code[i + 1] == '*':
            end = code.find("*/",i+2)
            if end != -1:
                i = end + 2
                continue
        print(code[i], end = '')
        i += 1
if __name__ == '__main__':
    main()

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 408K, 提交时间: 2020-10-12 23:14:42

#include <cstdio>

#include <regex>

#include <string>

using namespace std;

int main() {

    string code;

    regex r("^((?:[^/\\\\\"]|/[^*]|\\\\\"|\\\\(?!\")|\"(?:\\\\[\\s\\S]|[^\\\\\"])*\")*)/\\*[\\s\\S]*?\\*/");

    for (int c; (c = getchar()) != -1;) code.push_back(c);

    auto pos = code.cbegin();

    for (smatch m; regex_search(pos, code.cend(), m, r); pos = m.suffix().first) {

        printf("%s", m.str(1).c_str());

    }

    while (pos != code.cend()) putchar(*pos++);

}

C++ 解法, 执行用时: 3ms, 内存消耗: 396K, 提交时间: 2021-09-05 19:06:16

#include<bits/stdc++.h>
using namespace std;
int main(){
    string code;
    regex r("^((?:[^/\\\\\"]|/[^*]|\\\\\"|\\\\(?!\")|\"(?:\\\\[\\s\\S]|[^\\\\\"])*\")*)/\\*[\\s\\S]*?\\*/");
    for (int c; (c = getchar()) != -1;) code.push_back(c);
    auto pos = code.cbegin();
    for (smatch m; regex_search(pos, code.cend(), m, r); pos = m.suffix().first) printf("%s", m.str(1).c_str());
    while (pos != code.cend()) putchar(*pos++);
}

上一题