Problem I: 去注释
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 116 Solved: 47
[Submit][Status][Web Board]
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;
}
题目大意:按题目所说,模拟即可。
思路:
有一个难点,怎么判断输入结束,因为他连换行符也要保存,所以要用getchar()将所以字符输进去,当getchar=EOF时,输入便结束了。接下来只需要去注释即可,可以用两个flag标记两种需要去注释的情况,第一种/*和*/匹配,第二种//和\n匹配,只有两种情况都不属于时把字符存到一个新数组。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<cmath>
char a[200000], b[200000];
using namespace std;
int main()
{
char c;
int i = 0;
while (c = getchar())
{
if (c == -1)
break;
a[i] = c;
i++;
}
int len = strlen(a);
int flag = 1, j = 0, flag1 = 0;
/*for(int i=0;i<len;i++)
cout<<a[i];*/
for (int i = 0; i<len; i++)
{
if (flag1&&a[i] == '\n')
flag1 = 0;
if (a[i] == '/'&&a[i + 1] == '*')
{
i++;
flag = 0;
continue;
}
if (a[i] == '*'&&a[i + 1] == '/')
{
flag = 1;
i++;
continue;
}
if (a[i] == '/'&&a[i + 1] == '/')
{
flag1 = 1;
i++;
continue;
}
if (flag && !flag1)
{
b[j] = a[i];
j++;
}
}
for (int i = 0; i<j; i++)
cout << b[i];
cout << endl;
return 0;
}