Problem I: 去注释
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 114 Solved: 46
Description
给你一段C++代码,将其中的注释去除后输出剩余的代码。
注释共有两种形式:
1. 行注视:以//开头,一直作用到行尾为止。
例子:
int n;//n表示数据规模
int a;
去注释后:
int n;
int a;
注意:保留行尾换行符
2. 段注视:以/*开头,到*//结尾,中间部分都是注释,可以跨行。
例子:
int main() {
/*
我是
一段
注释
*/
}
去注释后:
int main() {
}
注意:由于在线评测系统(Online Judge)对网页显示文本作了格式化,一些空行会被删去,导致上面显示的删除后的结果不正确。删除注释后,剩余的代码应该是三行,两行代码之间有一个空 行。这是因为:在段注释结尾符的后面有一个换行符,它不在注释内,需要保留。
Input
一段C++程序代码
Output
去掉注释部分后的程序
Sample Input
int main()
{
/*
我是 一段 注释
*/
int n;//n表示数据规模
}
Sample Output
int main()
{
int n;
}
HINT
int main() {
int n;
}
【分析】
-
对输入结束的标志没有严格要求,所以不用判断'{'和'}'的匹配度来判断输入是否结束。一开始想用栈做,但是感觉好麻烦。。。
-
创建一个字符串型数组,这样就相当于二维字符数组。然后匹配就好了。
-
string中的erase():erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符;
-
getline(cin,s[i++]):按行输入
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s[10000];
int i=0,k=0,flag=0,cnt=0;
while(getline(cin,s[i++]))
k++; //统计有多少行
//cout<<k<<endl;
for(i=0;i<k;i++)
{
int len=s[i].length();
for(int j=0;j<len;j++)
{
if(s[i][j]=='/'&&s[i][j+1]=='/')
{
s[i].erase(j,len);//
break;
}
if(s[i][j]=='/'&&s[i][j+1]=='*')
{
for(int w=i+1;w<k;w++)
{
flag=0;int lenn=s[w].length();
for(int q=0;q<lenn;q++)
if(s[w][q]=='*'&&s[w][q+1]=='/')
{
i+=w-i;
s[w].erase(0,q+2);
flag=1;break;
}
if(flag==1)break;
}
}
}
cout<<s[i]<<endl;
}
return 0;
}