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

题目链接

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

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

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

#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();


    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43798170/article/details/114422118