【蓝桥杯】[算法提高VIP] 去注释 C语言网

字符串处理

原题链接

在这里插入图片描述

  • 需要注意的是可能出现多处注释,所以我标记完一个完整的注释内容后就先消除这一段注释,这样for循环中就多了一个用于char数组覆盖的for,会更复杂,然后接着遍历后面的字符,如果有注释也是先消除后再继续,这时候for循环的时候注意 i 的及时更新。
  • 看了别人的代码,可以一边遍历然后输入,控制是否输出的flag就行。好! Better
  • 字符串的下标还有用来标记的flag和mark多了容易乱,加好注释或者多输出一下调试一下。
#include<iostream>
using namespace std;
char s[1006];
int main()
{
    char c;
    int x=0;
    while((c = cin.get())!=EOF)//题目中的提示,可以把一个个的先存进char数组,方便后续处理
    {
        s[x++] = c;
    }
    s[x] = '\0';//结束符
    int flag = 0;
    int index_begin = 0;//注释开始的位置
    int index_end = 0;//注释结束的位置
    for(int i=0; i<x; i++)
    {
        //cout<<s[i];
        int mark =0 ;
        if(flag==0&&s[i]=='/'&&(s[i+1]=='/'||s[i+1]=='*'))
        {
            index_begin= i;//记下注释开始的地方

            if(s[i+1]=='/')
                flag = 1;
            else
                flag = 2;
        }
        //  cout<<i<<"  "<<flag<<endl;
        if(flag == 1)
        {
            //单行注释
            if(s[i]=='\n')//换行符,
            {
                index_end = i-1;
                flag = 0;
                mark = 1;//标记表示一个完整的注释块截取完成。
            }
        }
        if(flag == 2)
        {
       		 //多行注释
            if(s[i]=='*'&&s[i+1]=='/')
            {
                index_end = i+1;
                flag = 0;
                mark = 1;
            }
        }
        //char c2;

        if(mark==1)
        {
            //cout<<index_begin<<" "<<index_end<<endl;
            int len = index_end-index_begin;
            for(int j = index_begin; j<strlen(s); j++)//将注释覆盖掉
            {
                s[j]=s[j+len+1];
                i=index_begin;
            }
        }



    }
    for(int i=0; i<strlen(s); i++)
    {
        cout<<s[i];
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值