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; }