第十次CCF计算机软件能力认证 第三题 Markdown(大模拟、字符串)

2021-03-08 12:28:59 浏览数 (1)

题目链接

一道很有区分度的模拟题,我做了1.5h~

本质上如果不算强调和链接的影响 我们是不难做出前三种情况的

但是 随着对这道题目的深入 我发现做出这道题目主要有两个难点: 1.要考虑到输入状态的转移,比如输入段落切换到输入表格、输入表格切换到输入段落 2.虽然强调不存在嵌套 但链接和强调都存在嵌套 我们可以强调处理完再处理链接,这两种先后顺序处理是不影响的(可以观察替换格式易得)

代码语言:javascript复制
#include<bits/stdc  .h>
using namespace std;
string s;
void f1();
void f2();
void f3();
string pr1(string s);
string pr2(string s);
string pr1(string s){
    string ans;
    for(int i=0;s[i];i  ){
        if(s[i]=='_'){
            //cout<<s<<"a"<<endl;
            int j=i 1;
            while(s[j]&&s[j]!='_')j  ;
            string tepp="<em>" s.substr(i 1,j-i-1) "</em>";
            ans =tepp;
            i=j;
            continue;
        }
        ans =s[i];

    }
    ans=pr2(ans);
    return ans;
}
string pr2(string s){
    string ans;
    for(int i=0;s[i];i  ){
        if(s[i]=='['){
            //cout<<s<<"a"<<endl;
            int j=i 1,cun;
            while(s[j]&&s[j]!=']')j  ;
            string text=s.substr(i 1,j-i-1);
            cun=j 2;
            j =2;
            while(s[j]!=')')j  ;
            string link=s.substr(cun,j-cun);
            string tepp="<a href="" link "">" text "</a>";
            ans =tepp;
            i=j;
            continue;
        }
        ans =s[i];

    }
    return ans;
}
void f1(){
    int cnt=0;
    while(cnt<s.size()&&s[cnt]=='#')cnt  ;
    int cun=cnt;
    while(cnt<s.size()&&s[cun]==' ')cun  ;
    cout<<"<h"<<cnt<<'>'<<pr1(s.substr(cun,s.size()-cun))<<"</h"<<cnt<<'>'<<endl;
}
void f2(){
    cout<<"<ul>"<<endl;
    int tep=1;
    while(tep<s.size()&&s[tep]==' ')tep  ;
    cout<<"<li>"<<pr1(s.substr(tep,s.size()-tep))<<"</li>"<<endl;
    while(getline(cin,s)){
        if(s=="")break;
        if(s[0]=='#'){
            cout<<"</ul>"<<endl;
            f1();
            return;
        }
        if(s[0]!='*'){
            cout<<"</ul>"<<endl;
            f3();
            return;
        }
        int tep=1;
        while(tep<s.size()&&s[tep]==' ')tep  ;
        cout<<"<li>"<<pr1(s.substr(tep,s.size()-tep))<<"</li>"<<endl;
    }
    cout<<"</ul>"<<endl;
}
void f3(){
   cout<<"<p>"<<pr1(s);
    while(getline(cin,s)){
        if(s==""){
            cout<<"</p>"<<endl;
            return;
        }
        else if(s[0]=='#'){
            cout<<"</p>"<<endl;
            f1();
            return;
        }
        else if(s[0]=='*'){
            cout<<"</p>"<<endl;
            f2();
            return;
        }
        cout<<endl<<pr1(s);
    } 
    cout<<"</p>"<<endl;
}
int main(){
    while(getline(cin,s)){
        if(s=="")continue;
        if(s[0]=='#'){
            f1();
        }
        else if(s[0]=='*'){
            f2();
        }
        else if(s[0]!='#'&&s[0]!='*')f3();


    }
}

0 人点赞