游客 Signup | Login
中文 | En

3322 - 删除嵌套注释


大家在<span>C</span>语言课程当中一定接触过注释。注释主要是用来表明程序用意的,不作为程序编译的一部分。<span>C</span>语言当中使用“<span>/*”</span>和“<span>*/”</span>来标记注释的。“<span>/*”</span>和“<span>*/”</span>之间的部分可以标注当前程序的用意,例如以下<span>C</span>语言程序:

<span>/*</span>将要定义一个整数<span>*/</span>

<span>int i;</span>

然而,注释当中是不可以嵌套注释的,例如以下程序所用到的注释就是非法的:

<span>/*</span>将要定义一个整数<span>/*</span>这个整数是用来作为计数器的<span>*/*/</span>

<span>int i;</span>

Input


<span></span>一段写好的程序,其中可能含有注释的嵌套。(为简单起见,测试数据中不包含空行。)注释一律独立成行(也就是说一行当中不同时包含需要编译的代码和注释,也不会同时包含多余一个的完整注释),例如以下两个代码是不出现的:

情况<span>1</span>

<span>int a = 0; /*</span>定义<span>*/</span>

情况<span>2</span>

<span>int a = 0; /*/*</span>非法<span>*/</span>注释<span>*/ /*</span>合法注释<span>*/</span>

<span></span>现在给你一段写好的程序,请你开发一个新的编译辅助工具将其中非法的注释整个删除。

Output


删除非法注释后的代码。

Examples

Input

#include <stdio.h>
int main()
{
    /*int a;
    /*printf("%d",&a);*/*/
return 0;
/*返回*/
}

Output

#include <stdio.h>
int main()
{
return 0;
/*返回*/
}

Solution C++

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main() {
    bool isNote = false, bufferValid = true, ansFlag = true, bufferEnd = false, bufferFlag = true;
    int cnt = 0;
    string line, buffer = "", ans = "";
    while (getline(cin, line)) {
        for (int i = 0; i < line.length()-1; i++) {
            // 如果是注释开头
            if (line[i]=='/'&&line[i+1]=='*') { 
                isNote = true; // 注释开始
                cnt++; // 头注释+1
            }
            // 如果是注释末尾
            if (line[i]=='*'&&line[i+1]=='/') { 
                cnt--, i++; // i++是防止两个尾注释连成一个头注释
                if (cnt==0) bufferEnd = true;
            }
            // 如果超过两个头注释了,则这个注释不合法
            if (cnt > 1) bufferValid = false;        
        }
        // 如果这行不在注释内,则加进ans,如果是注释,则放进buffer里
        if (!isNote) {
            if (ansFlag) ans += line, ansFlag = false;
            else ans += "\n" + line;
        } else {
            if (bufferFlag) buffer += line, bufferFlag = false;
            else buffer += "\n" + line;
        }
        // 如果这是注释末尾且注释且是合法的,则加进ans,否则清空buffer
        if (bufferEnd) {
            if (bufferValid) {
                if (ansFlag) ans += buffer, ansFlag = false;
                else ans += "\n" + buffer;
            } else buffer = "", bufferValid = true;
            bufferEnd = false, bufferFlag = true;
        }
        if (cnt == 0) isNote = false;
    }
    cout << ans << endl;
    return 0;
}

Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题