#THU20172B. 工资
工资
时间限制: 1.0 秒
空间限制: 512 MB
题目背景
wangyurzee7 和 Yazid 是好朋友。
题目描述
wangyurzee7 是一个繁忙的工作者,他每天都要写很多有趣的代码。
Yazid 开了一家有趣的公司,wangyurzee7 当上了有趣的公司的项目经理。这家公司给码农们结算工资的方式也十分有趣,每个人的薪水正比于所写代码的长度。不过很快,有趣的码农们学会了使用长长的变量名、大括号换行、增加长长的注释、tab 换成空格等等方法,这让 Yazid 头疼不已。
有一天,wangyurzee7 收到了 Yazid 的一个任务:在这个月结算工资之前,写一个脚本把程序中所有的注释全部去掉,再将所有的函数名、变量名替换成单个字母,然后再进行统计代码长度。
这个任务非常简单,但 wangyurzee7 实在是太弱了,他只在 github 上找到了批量替换函数名的轮子,而没有找到去掉注释和替换变量名的轮子,而且这个代码看起来不是那么有趣,wangyurzee7 写不动。
Yazid 勃然大怒,他根本没想到这么简单的任务 wangyurzee7 都不能胜任。他把 wangyurzee7 狠狠地批判了一番。
当然啦,责任还是要由 wangyurzee7 来承担。无奈之下,他只好退而求其次,只需要针对 C/C++ 代码,去掉里面的注释就向 Yazid 交差:
1.单行注释 //:一旦出现,并且被 C/C++ 编译器认为是注释,那么从 // 符号开始到行末都被算作注释,比如下面程序的 //233 就会被算作注释:
#include <cstdio>
int main()
{
printf("//");//233
return 0;
}
并且如果单行注释最末尾的可见字符为 \ 字符,则下一行从行初到行末均被认为是注释。
2.多行注释 /* */:一旦出现,并且被 C/C++ 编译器认为是注释,那么从 /* 符号开始到 */ 符号结束都被算作注释,比如下面程序的 行就会被算作注释:
/* Welcome to THUSCU2017!
* This is the easiest problem!
* \\\\\\\puts("\\\\\\\/**\///////");///////
*///
int main(/**//**/){return!printf("%d",'//');}
3.注释的处理方法:对于每个注释,将从注释的开始一直到注释的结束的字符串,替换成一个空格,其他地方的代码不允许做任何改动。将处理完的代码输出即可。比如上面的两段代码会变成下面这样(第一份代码第四行最末尾有一个空格,第二份代码第一行有两个空格):
#include <cstdio>
int main()
{
printf("//");
return 0;
}
int main( ){return!printf("%d",'//');}
既然要做的东西变少了,问题也就变得更简单了。请你帮帮可怜的 wangyurzee7 解决这个问题。
输入格式
从标准输入读入数据。
输入有若干行,每一个测试样例都是一个能够在 C/C++ 编译器下编译运行的代码,里面包含了若干注释。
输出格式
输出到标准输出。
输出经过删除注释,并在原位置替换空格过后的 C/C++ 代码。
请注意,本题采用严格判题方式,即不忽略行末空格以及文件尾换行符。
#include <cstdio>
int main()
{
printf("//");//233
return 0;
}
#include <cstdio>
int main()
{
printf("//");
return 0;
}
/* Welcome to THUSCU2017!
* This is the easiest problem!
* \\\\\\\puts("\\\\\\\/**\///////");///////
*///
int main(/**//**/){return!printf("%d",'//');}
int main( ){return!printf("%d",'//');}
#include <bits/stdc++.h>
int main(int argc, char const *argv[])
{
printf("\"../**/...//%s...","/etc//apt//sources.list");///\/*.\./*\
printf("\"../**/...//%s...","/etc//apt//sources.list");///\\.\./*\
return 0;/*
}
#include <bits/stdc++.h>
int main(int argc, char const *argv[])
{
printf("\"../**/...//%s...","/etc//apt//sources.list");
}
子任务
对于 的数据,保证只有单行注释 //,但是并不保证不跨行。
对于另外 的数据,保证只有多行注释 /* */,但是并不保证不跨行。
存在 的数据,保证注释没有跨行情况。
对于 的数据,保证代码总长度不超过 20KB,所有字符都是常用可见字符或者空格、tab、换行符,并且不含 ASCII 标准之外的字符(如中文、拓展 ASCII 表等等),所有测试数据中的程序均可用 C/C++ 编译器编译运行。保证以字符 # 作用的行(包含 include、宏定义相关语句)中,引号成对出现,并且不包含以 \ 结尾的单行注释;单行注释若出现跨行情况,必定是 \ 字符之后紧跟换行符。
提示
请注意考虑各种字符串情况,诸如:
- 字符串转义:
"/*\"//*/" - 字符常量:
'//"'