CCF認證 2017-03 Markdown
阿新 • • 發佈:2019-01-02
模擬題,文字處理,具體方法看程式碼註釋
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=100+10; string ans[N]; int main() { string s; bool p=false,u=false; //輔助標記 ,u代表列表,p代表段落 string a="",b=""; //輔助儲存字串 int k=0; //記錄行數 for(int i=0;i<N;i++) ans[i]=""; while(getline(cin,s)) //這裡先處理區塊,並儲存 { if(s.length()==0) //空行 { if(u) { ans[k]+="</ul>"; k++; u=false; } if(p) { ans[k-1]+="</p>"; p=false; } } else if(s[0]=='#') //標題 { int t=0; while(s[0]=='#') s.erase(0,1),t++; while(s[0]==' ') s.erase(0,1); ans[k]+="<h";ans[k]+='0'+t;ans[k]+='>'; ans[k]+=s;ans[k]+="</h";ans[k]+='0'+t;ans[k]+='>'; k++; } else if(s[0]=='*') //無序列表 { if(!u) { u=true; ans[k]+="<ul>";k++; } s.erase(0,1); while(s[0]==' ') s.erase(0,1); ans[k]+="<li>";ans[k]+=s;ans[k]+="</li>"; k++; } else //段落 { if(!p) { ans[k]+="<p>"; p=true; } ans[k]+=s; k++; } } //檔案結束後,要像讀到空行那樣處理 if(u) { ans[k]+="</ul>"; k++; u=false; } if(p) { ans[k-1]+="</p>"; p=false; } //for(int i=0;i<k;i++) cout<<ans[i]<<endl; for(int i=0;i<k;i++) { for(int j=0;j<ans[i].length();j++) //這裡處理行內 { if(ans[i][j]=='_') //發現強調,處理完後,j依然指向原位置,這樣就可以巢狀處理強調和連結 { ans[i].erase(j,1); while(ans[i][j]!='_') a+=ans[i][j],ans[i].erase(j,1); ans[i].erase(j,1); ans[i].insert(j,"</em>"); ans[i].insert(j,a); ans[i].insert(j,"<em>"); a=""; } if(ans[i][j]=='[') //發現連結,處理完後,j依然指向原位置,這樣就可以巢狀處理強調和連結 { ans[i].erase(j,1); while(ans[i][j]!=']') a+=ans[i][j],ans[i].erase(j,1); ans[i].erase(j,2); while(ans[i][j]!=')') b+=ans[i][j],ans[i].erase(j,1); ans[i].erase(j,1); ans[i].insert(j,"</a>"); ans[i].insert(j,a); ans[i].insert(j,"\">"); ans[i].insert(j,b); ans[i].insert(j,"<a href=\""); a=b=""; } } } for(int i=0;i<k;i++) cout<<ans[i]<<endl; return 0; }