3番目の質問第10回CCFコンピューターソフトウェアコンピテンシー認定のマークダウン(大きなシミュレーション、文字列)

トピックリンク

非常に識別可能なシミュレーションの質問、私は1.5時間やりました〜

本質的に、強調とリンクの影響を考慮しなければ、最初の3つの状況を作ることは難しくありません。

しかし、このトピックが深まる
につれ、このトピックを作成する上で2つの主な問題があることがわかりました。1。入力段落から入力フォームへの切り替え、入力フォームから入力段落への切り替えなど、入力状態の遷移を考慮する必要があります。
2.強調されているが入れ子はありませんが、リンクの入れ子と強調があります。処理を強調してからリンクを処理できます。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