暑假训练赛8--I去注释 erase函数+字符串数组

Problem I: 去注释

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 114  Solved: 46

[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;

}

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;
}

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/81327484