也是奇了怪了,三个月前,怎么调试都是90分,这次竟然一下子就100分了
这道题不是很复杂,用好vector就行了,然后对字符串进行一些简单的处理
对于段落,设置一个bool形变量,对于vector.back()进行加“</p>”
无序列表亦是如此,
对于剩下一个标题,对于上面两个的bool变量操作一下就好了
还有一个空行,空行跳过去(对于那两个bool变量还是要操作的)就好了
下面是代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void normal(string &str){
size_t f1=str.find("_");
// cout<<f1<<endl;
while(f1!=string::npos){
str=str.substr(0,f1)+"<em>"+str.substr(f1+1,str.length()-f1-1);
//cout<<str<<endl;
f1=str.find("_");
str=str.substr(0,f1)+"</em>"+str.substr(f1+1,str.length()-f1-1);
//cout<<str<<endl;
f1=str.find("_");
}
size_t f2=str.find("[");
while(f2!=string::npos){
size_t f3=str.find("]");
size_t f4=str.find("(");
size_t f5=str.find(")");
string link=str.substr(f4+1,f5-f4-1);
string text=str.substr(f2+1,f3-f2-1);
str=str.substr(0,f2)+"<a href=\""+link+"\">"+text+"</a>"+str.substr(f5+1,str.length()-f5-1);
f2=str.find("[");
// cout<<"1"<<endl;
}
}
string IntToString(int a){
char b[30];
sprintf(b,"%d",a);
return b;
}
vector<string> vec;
int main(){
string str;
bool p=false,ul=false;
while(getline(cin,str)){
if(str==""){
if(p){
p=false;
vec.back()=vec.back()+"</p>";
}
if(ul){
ul=false;
vec.push_back("</ul>");
}
continue;
}
normal(str);
if(str[0]=='#'){
if(p){
p=false;
vec.back()=vec.back()+"</p>";
}
if(ul){
ul=false;
vec.push_back("</ul>");
}
int n=0;
while(str[0]=='#'){
n++;
str=str.substr(1,str.length()-1);
}
while(str[0]==' ')
str=str.substr(1,str.length()-1);
char c=n+'0';
string b=" ";
b[0]=c;
str="<h"+b+">"+str+"</h"+b+">";
vec.push_back(str);
}
else if(str[0]=='*'){
if(p){
vec.back()=vec.back()+"</p>";
p=false;
}
if(!ul){
vec.push_back("<ul>");
ul=true;
}
normal(str);
str=str.substr(1,str.length()-1);
while(str[0]==' ')
str=str.substr(1,str.length()-1);
str="<li>"+str+"</li>";
vec.push_back(str);
}
else{
if(ul){
vec.push_back("</ul>");
ul=false;
}
// cout<<"1"<<endl;
normal(str);
if(!p) {
str="<p>"+str;
p=true;
}
vec.push_back(str);
}
}
if(p){
p=false;
vec.back()=vec.back()+"</p>";
}
if(ul){
ul=false;
vec.push_back("</ul>");
}
for(vector<string>::iterator it=vec.begin();it!=vec.end();it++){
cout<<(*it)<<endl;
}
}
/*
# Heading
## Sub-heading
paragraph are separated
by a blank line.
Text attribute _italic_.
Bullet list:
* apples
* oranges
* pears
A [link](http://example.com).
*/
//也是奇了怪了,这次得了一百分