H106OJ_第三次练习_去注释:
提示:本文章为课程任务(学习记录)
本文章为课程第三次练习习题记录,仅供参考。
问题描述
题目:
给你一段C++代码,将其中的注释去除后输出剩余的代码。
注释共有两种形式:
- 行注释:以//开头,一直作用到行尾为止。
例子:
int n;//n表示数据规模
int a;
去注释后:
int n;
int a;
注意:保留行尾换行符
- 段注释:以/开头,到//结尾,中间部分都是注释,可以跨行。
例子:
int main()
{
/*
我是
一段
注释
*/
}
去注释后:
int main()
{
}
注意:由于在线评测系统(Online Judge)对网页显示文本作了格式化,一些空行会被删去,导致上面显示的删除后的结果不正确。删除注释后,剩余的代码应该是三行,两行代码之间有一个空行。这是因为:在段注释结尾符的后面有一个换行符,它不在注释内,需要保留。
输入:
一段C++程序代码
输出:
去掉注释部分后的程序
样例:
输入:
int main()
{
/*
我是
一段
注释
*/
int n;//n表示数据规模
}
输出:
int main()
{
int n;
}
思路:
1.怎么读入数据:利用while((ch = cin.get()) != EOF)
即可判断输入是否结束。将输入的每一个字节都存入数组,在对数组进行操作。
2.怎么操作:两种方式,删除或者跳跃,删除太麻烦了。直接选择跳跃。
3.怎么跳越:两种注释都有特征:
/**/型
对于数组,如若遇到下标i的是/且恰好下标i+1的是*,则为/**/类型注释开始。
如若遇到下标j的是*且恰好下标j+1的是/,则则为/**/类型注释结束。
//型
对于数组,如若遇到下标i的是/且恰好下标i+1的是/,则为//类型注释开始。
如若读到换行,则是注释结束。
有了上述两点,就简单了。
代码:
#include<iostream>
using namespace std;
const int N = 1e5;
int pos;
char ch, code[N];
int main()
{
while((ch = cin.get()) != EOF)
code[pos++] = ch;
code[pos++] = ' ';
for(int i = 0; i < pos - 1; i ++)
{
if(code[i] == '/' && code[i + 1] == '*')
{
i += 2;
for(int j = i; j < pos; j ++)
if(code[j] == '*' && code[j + 1] == '/')
i = j, j = pos;
i += 2;
}
if(code[i] == '/' && code[i + 1] == '/')
{
i += 2;
while(code[i] != '\n')
i ++;
}
cout << code[i];
}
return 0;
}
这里面有一点需要注意,就是为了防止越界,在读取完之后,要再数组末尾加上code[pos++] = ' ';
Over,Bye~ 2022.04.03