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